Spark新手求助:如何读取请求中的JSON参数
如何在Spark中正确读取前端发送的JSON请求参数
嘿,我刚好遇到过类似的问题,给你梳理下问题所在和解决办法!
你的问题出在前端发送请求的方式不对:当你直接把JavaScript对象作为body传给fetch时,浏览器会自动将其编码为multipart/form-data格式,并且把对象直接转成了[object Object]字符串(这是对象默认的toString()结果),所以后端拿到的自然不是有效的JSON。
接下来分两部分解决:
一、修正前端请求代码
你需要做两个关键修改:
- 用
JSON.stringify()把JavaScript对象转换成JSON字符串 - 设置
Content-Type: application/json请求头,告诉后端这是JSON格式的数据
修改后的代码如下:
let data = { req: this.state.results }; const apiAddress = 'http://localhost:4567/results'; fetch(apiAddress, { method: 'post', // 添加请求头,指定内容类型为JSON headers: { 'Content-Type': 'application/json' }, // 将对象序列化为JSON字符串 body: JSON.stringify(data) }).then((res) => { console.log(res); return res; });
二、Spark后端处理JSON请求
Spark本身不会自动解析JSON请求体,你需要借助Jackson(Spark默认依赖的JSON库)来完成解析。
步骤1:确保依赖齐全
如果用Maven,在pom.xml中添加Jackson依赖(如果还没加的话):
<dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</artifactId> <version>2.9.4</version> <!-- 用你实际使用的Spark版本 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 适配Spark版本的Jackson版本 --> </dependency>
步骤2:解析请求体
有两种常用方式解析JSON:
方式1:手动读取JSON字符串并转换为对象
import com.fasterxml.jackson.databind.ObjectMapper; import spark.Request; import spark.Response; import spark.Spark; public class SparkServer { private static final ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) { Spark.post("/results", (request, response) -> { // 读取原始JSON字符串 String jsonBody = request.body(); // 将JSON字符串转换为自定义的实体类对象 RequestData requestData = objectMapper.readValue(jsonBody, RequestData.class); // 现在你可以直接使用requestData里的req字段了 System.out.println("收到的请求参数:" + requestData.getReq()); // 设置响应类型为JSON(可选,根据你的需求) response.type("application/json"); return objectMapper.writeValueAsString("请求处理成功"); }); } // 定义和前端请求结构对应的实体类 static class RequestData { private Object req; // 如果你知道results的具体类型,可以换成对应的类,比如List、Map等 // 必须提供getter和setter,Jackson需要它们来完成序列化/反序列化 public Object getReq() { return req; } public void setReq(Object req) { this.req = req; } } }
方式2:使用Spark内置的bodyAsClass方法(更简洁)
Spark提供了request.bodyAsClass(Class<T>)方法,可以直接把请求体转换为指定的Java类,前提是有Jackson依赖:
Spark.post("/results", (request, response) -> { // 直接将请求体转换为RequestData对象 RequestData requestData = request.bodyAsClass(RequestData.class); System.out.println("收到的请求参数:" + requestData.getReq()); response.type("application/json"); return objectMapper.writeValueAsString("请求处理成功"); });
这样修改后,你就能在Spark后端正确读取到前端发送的JSON参数了!
内容的提问来源于stack exchange,提问作者Xhark




