在数据测试的过程中发现,同一个Controller同一个Mapping,使用前端页面发送
ajax
请求
成功
接收到数据,使用
postman的x-www-form-urlencoded
发送请求
成功
接收到数据,但是使用
postman的raw
发送请求的和
restfultoo
l发送JSON格式的请求都
失败
了(传入的对象为空)。
在参数前加上注解@RequestBody(@RequestBody User user)
postman-raw
和
restfultool
工具发送请求
成功
了,但是
ajax
和
postman的x-www-form-urlencoded
却又
失败
了。
本文将解释记录说明@RequestBody、@RequestParam注解与ajax、postman、restfultool发送的请求的成功与失败的原因,以及请求的发送和@RequestBody、@RequestParam两个注解的使用。
controller:
@PutMapping
public ResultData updateUser(User user){
System.out.println("要更新的对象是"+user);
return new ResultData(888,"成功",userService.updateById(user));
前端ajax:成功
var user = new Object();
user.username = $("#username").val();
user.password = $("#password").val();
user.id = $("#uid").val();
user._method = "put";
$.ajax({
url:"/users",
data:user,
dataType:"json",
type:"post",
success:function (res){
if (res.code==888){
alert("修改成功!");
location.href = "/html/user_list.html";
}else {
alert("修改失败!");
Postman——www-form-urlencoded:成功
Postman——raw JSON:失败
RestfulTool:失败
原因分析与解决办法
1.前端请求传Json对象则后端使用@RequestParam
2.前端请求传Json对象的字符串则后端使用@RequestBody。
在postman-raw和restfultool发送的都是json对象需要使用@RequestBody
在postman-www-form-urlencoded发送的是json字符串需要使用@RequestParam(参数名一样可以不加)
使用ajax两种都可以发送
ajax发送json对象:后端使用@RequestParam(参数名一样可以不加)
var user = new Object();
user.username = $("#username").val();
user.password = $("#password").val();
user.id = $("#uid").val();
user._method = "put";
$.ajax({
url:"/users",
data:user,
dataType:"json",
type:"post",
success:function (res){
if (res.code==888){
alert("修改成功!");
location.href = "/html/user_list.html";
}else {
alert("修改失败!");
ajax发送json字符串:后端使用@RequestBody
var user = new Object();
user.username = $("#username").val();
user.password = $("#password").val();
user.id = $("#uid").val();
// user._method = "put";
$.ajax({
url:"/users",
data:JSON.stringify(user),
dataType:"json",
contentType: "application/json;charset=utf-8",
type:"put",
success:function (res){
if (res.code==888){
alert("修改成功!");
location.href = "/html/user_list.html";
}else {
alert("修改失败!");
如果发送的json和应该使用的注解不一致(比如前端发送JSON对象,后端却使用@RequestBody、前端发送JSON字符串,后端使用@RequestParam)可能会抛出异常Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
问题点1:
如果Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”无论是POST请求还是GET请求都是可以通过这种方式成功获取参数,但是如果前端POST请求中的body是Json对象的话,会报上述错误。
请求中传JSON时设置的Content-Type 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据。这是因为,Tomcat的HttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request)。
问题点2:
当前端请求的Content-Type是Json时,可以用@RequestBody这个注解来解决。@RequestParam 底层是通过request.getParameter方式获得参数的,换句话说,@RequestParam 和request.getParameter是同一回事。因为使用request.getParameter()方式获取参数,可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。所以,@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。
@RequestBody接受的是一个json对象的字符串,而不是Json对象,在请求时往往都是Json对象,用JSON.stringify(data)的方式就能将对象变成json字符串。
chttps://www.cnblogs.com/shirandedan/p/7727326.html
引言在数据测试的过程中发现,同一个Controller同一个Mapping,使用前端页面发送ajax请求成功接收到数据,使用postman的x-www-form-urlencoded发送请求成功接收到数据,但是使用postman的raw发送请求的和restfultool发送JSON格式的请求都失败了(传入的对象为空)。在参数前加上注解@RequestBody(@RequestBody User user)postman-raw和restfultool工具发送请求成功了,但是aja...
@
RequestBody用于在请求体中获取参数,一般为
json或者xml
格式的数据。
本文示例
使用postman请求保存数据接口,将
json格式的数据保存到elasticsearch中。
一、编写controller接口
二、
postman发送请求
一、编写controller接口
package cn.jack.elasticsearchdemo.controller;
import cn.jack.elasticsearchdemo.domain.Person;
问题点1:
如果Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”无论是POST请求还是GET请求都是可以通过这种方式成功获取参数,但是如果前端POST请求中的body是Json对象的话,会报上述错误。
请求中传JSON时设置的Content-Type 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据。这是因为,Tomcat的HttpSer
postman 可以在你java项目运行起来后,输入url,然后设置你想传到后端的数据类型,以及数据值。进行测试端口。
@
RequestBody在后台接收时,一般用于传过来一个实体类的时候,
postman需要
使用post方法,然后再
body中写入传值对象,再
param中写一个传值类型如下:
@
RequestParam在后台接收时,一般是form表单,与方法参数一一对应,用get方法即可,只需要在
param中写入key -value即可
在这里插入图片描述
后端接口代码
@PostMapping(value = "/xxx/xxxx")
public ResponseData<Boolean> xxxx(@RequestBody XxxBeanParam param) {
//code...
return ResponseData.success(xxxService.xxx(param));
在@RequestBody约定的XxxBeanParam对象中包含了三个字段:aaaaa=String,bbbbb=List<String&
@
RequestMapping("/list2")
public String test2(@
RequestParam int userId) {
return "list";
(1)不加@
RequestParam前端的参数名需要和后端控制器的变量名保持一致才能生效
(2)不加@
RequestParam参数为非必传,加@R