You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在服务端接收表单参数?React+Axios请求取值疑问

问题:React + Axios POST请求,Java服务端如何获取参数?

我有一个React JS应用,用axios库通过表单提交向服务端发送POST请求,客户端代码如下:

sendData(data,price) { 
  axios.post('http://localhost:8080/SampleJavaAPP/UserServer', { 
    item: data,//these value 
    price:price//these value 
  }) 
  .then(function (response) { 
    console.log(response); 
  }) 
  .catch(function (error) { 
    console.log(error); 
  }); 
}

我尝试用String name = request.getParameter("item")这种方式在服务端取值,但拿不到数据,不确定正确的获取方式是什么?


解答

你踩的坑其实很常见——axios默认发送的是JSON格式的请求体,而不是传统的表单编码数据,request.getParameter()只能解析表单编码的参数,自然拿不到JSON里的值。下面分两种主流场景给你具体解决方案:

1. 用Spring框架(最常用的Java后端方案)

直接借助Spring的注解就能自动解析JSON,不用手动处理请求体:

方式一:定义实体类接收参数

先创建一个和前端参数结构对应的Java类:

public class ItemRequest {
    private String item;
    private String price; // 要是价格是数字类型,换成Double/Integer就行

    // 必须要有无参构造器,Spring解析时需要
    public ItemRequest() {}

    // Getter和Setter方法不能少
    public String getItem() { return item; }
    public void setItem(String item) { this.item = item; }
    public String getPrice() { return price; }
    public void setPrice(String price) { this.price = price; }
}

然后在Controller里用@RequestBody注解接收:

@PostMapping("/SampleJavaAPP/UserServer")
public ResponseEntity<String> handleItemRequest(@RequestBody ItemRequest request) {
    String item = request.getItem();
    String price = request.getPrice();
    // 这里写你的业务逻辑
    return ResponseEntity.ok("收到参数:" + item + ",价格:" + price);
}

方式二:用Map直接接收(不想建实体类时用)

如果只是临时用或者参数结构简单,直接用Map接收更省事:

@PostMapping("/SampleJavaAPP/UserServer")
public ResponseEntity<String> handleItemRequest(@RequestBody Map<String, Object> requestBody) {
    String item = (String) requestBody.get("item");
    String price = (String) requestBody.get("price");
    // 业务处理逻辑
    return ResponseEntity.ok("请求处理完成");
}

2. 用原生Servlet(没用到Spring等框架)

这种情况需要手动读取请求体,再用JSON解析库(比如Jackson)解析:

首先确保你引入了Jackson的依赖(以Maven为例):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 用最新稳定版即可 -->
</dependency>

然后在Servlet的doPost方法里这样处理:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 第一步:读取请求体里的JSON字符串
    BufferedReader reader = request.getReader();
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
    String jsonBody = sb.toString();

    // 第二步:解析JSON
    ObjectMapper objectMapper = new ObjectMapper();
    // 方式一:用实体类(和上面的ItemRequest一样)
    ItemRequest requestData = objectMapper.readValue(jsonBody, ItemRequest.class);
    String item = requestData.getItem();
    String price = requestData.getPrice();

    // 方式二:用Map解析
    // Map<String, Object> requestMap = objectMapper.readValue(jsonBody, Map.class);
    // String item = (String) requestMap.get("item");

    // 第三步:处理业务并返回响应
    response.setContentType("application/json");
    response.getWriter().write("{\"status\":\"success\"}");
}

额外选项:让request.getParameter()生效(不推荐,除非有特殊需求)

如果你非要用request.getParameter(),可以修改axios的请求,让它发送表单编码的数据:

sendData(data,price) { 
  // 把参数转成表单编码格式
  const params = new URLSearchParams();
  params.append('item', data);
  params.append('price', price);

  axios.post('http://localhost:8080/SampleJavaAPP/UserServer', params, {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  }) 
  .then(function (response) { 
    console.log(response); 
  }) 
  .catch(function (error) { 
    console.log(error); 
  }); 
}

不过这种方式更适合传统表单提交,现在前后端交互主流是JSON格式,更推荐前面的JSON解析方案。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:06:06