You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动