SpringMVC关于@RequestBody加与不加的区别

发布时间 2023-09-21 15:21:33作者: knqiufan

SpringMVC关于@RequestBody加与不加的区别

前两天在做项目的时候遇到了这样一个问题,小组成员为了方便做接口测试,给Controller控制器上加了@RequestBody注解,但是前端请求接口时报错:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

为此记录一下关于@RequestBody的相关知识。

先说结论:

使用@RequestBody,用于处理JSON格式的数据,请求的Content-Type的类型为:application/json,请求参数类型为json字符串,格式为 { "id": 1, "name": "knqiufan" }

不使用@RequestBody,处理表单格式的数据,请求的Content-Type类型为:application/x-www-form-urlencodedmultipart/form-data,提交的数据格式为 id=1&name=knqiufan

所以开头说的前端请求接口报错就是因为前后端的请求参数格式不一致导致的报错。

以下用代码做一些测试。

后台接口:

@GetMapping("test1")
@ApiOperation("测试1")
public ActionResult<Object> test1(@RequestBody SignInModel signInModel) {
    return ActionResult.success(signInModel);
}

@GetMapping("test2")
@ApiOperation("测试2")
public ActionResult<Object> test2(SignInModel signInModel) {
    return ActionResult.success(signInModel);
}

前端请求(使用的是uniapp的请求方式,默认情况下Content-Typeapplication/x-www-form-urlencoded

// 使用表单格式传递
uni.request({
  url: "http://127.0.0.1:9000/api/hyHd/ww/app/xcgj/test2",
  method: "get",
  data: {
    ycyy: "cccccc",
    bzmGgJcrw: "928j8d782j3",
    bzmGgJcrwDy: "kckiwjkngoo"
  },
  success(res) {
    console.log("res", res)
  },
  fail(e) {
    console.error("e", e)
  }
})

// 使用json格式传递
uni.request({
  url: "http://127.0.0.1:9000/api/hyHd/ww/app/xcgj/test2",
  method: "get",
  header: {
    'Content-Type': 'application/json'
  },
  data: JSON.stringify({
    ycyy: "cccccc",
    bzmGgJcrw: "928j8d782j3",
    bzmGgJcrwDy: "kckiwjkngoo"
  }),
  success(res) {
    console.log("res", res)
  },
  fail(e) {
    console.error("e", e)
  }
})

关于Content-Type的一些知识

Content-Typeapplication/x-www-form-urlencoded时提交的数据方式是 a=1&b=2这样

Content-Typeapplication/json时需要以json字符串形式提交:{"a":1, "b":2}

写的稍微有点乱,先为自己记录使用。