文章引用
功能介绍
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
如果@RequestParam()的用法不理解,请参考——《springboot controller接收参数》
JSON字符串转换对象的逻辑
-
后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(
即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)
-
json字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
-
json字符串中,如果value为null的话,后端对应收到的就是null。
-
如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或"“都行。千万不能有类似"stature”
案例描述
package com.hb.market.dictionary.ctrl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.hb.market.dictionary.entity.Dictionary;
import com.hb.market.dictionary.service.IDictionaryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
@Controller
@RequestMapping("/dictionary")
@Api(tags = {"数据字典管理"}, value = "数据字典控制器")
public class DictionaryController {
@Resource
private IDictionaryService dictionaryService;
@ApiOperation("根据code查询数据字典")
@ApiImplicitParam(name = "code", value = "字典码", dataType = "String")
@GetMapping("/findByCode/{code}")
@ResponseBody
public List<Dictionary> findDictionaryByCode(@PathVariable("code") String code) {
System.out.println(dictionaryService);
List<Dictionary> list = dictionaryService.findDictionaryByCode(code);
return list;
}
@ApiOperation(value = "添加数据字典对象", notes = "添加数据字典对象")
@ApiImplicitParams({
@ApiImplicitParam(name = "code", value = "字典编码"),
@ApiImplicitParam(name = "value", value = "字典值"),
@ApiImplicitParam(name = "name", value = "字典显示名字"),
@ApiImplicitParam(name = "desc", value = "字典描述"),
})
@PostMapping("/addDictionary")
@ResponseBody
// @RequestBody 会将前端传递过来的JSON字符串转为复杂的Dictionary对象
public Dictionary addDictionary(@RequestBody Dictionary dictionary) {
System.out.println(dictionary);
// Dictionary dicObj = dictionaryService.addDictionary(dictionary);
return null;
}
@PostMapping("/searchDictionary")
@ResponseBody
public List<Dictionary> searchDictionary(@RequestBody Dictionary dictionary) {
System.out.println(dictionary);
List<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
return list;
}
}
如果使用@RequestBody,postman 传递参数的方式(传递JSON)
备注: 如果后台不是用@RequestBody修饰,则,可以使用 form-data 或者 x-www-form-unlencodeed 两种方式传递参数, spring 会帮助我们自动转换
前后端案例说明
后台使用@RequestBody修饰接收参数
后端代码使用 @RequestBody说明
@PostMapping("/searchDictionary")
public Object searchDictionary(@RequestBody Dictionary dictionary) {
log.info(dictionary.toString());
Page<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
return ObjectToResult.getResult(list);
}
前端传递参数用是字符串,header需要设置application/json
function postFetchAction() {
var paramObj = {
value: "food",
pageSize: 4,
pageNum: 1
};
var options = {
// 如果后台使用@RequestBody修饰接收参数, content-type 一定不能少,否则会报错
headers: {
"content-type": "application/json"
},
method: "POST", // *GET, POST, PUT, DELETE, etc.
mode: "cors", // no-cors, cors, *same-origin,
body: JSON.stringify(paramObj)
};
fetch("http://localhost:8080/dictionary/searchDictionary", options)
.then(function(res) {
debugger;
console.log(res);
// 这个函数返回的是接口响应的值,执行后面的then 方法
return res.json();
})
// 第二个 then 才是获取后台实际返回的结果
.then(function(response) {
debugger;
console.log(response);
});
}
使用postman 的方式
后台没有@RequestBody修饰接收参数
后端代码对象不用@RequestBody修饰
@PostMapping("/searchDictionary")
public Object searchDictionary(Dictionary dictionary) {
log.info(dictionary.toString());
Page<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
return ObjectToResult.getResult(list);
}
前端代码使用FormData传递参数,header不需要设置application/json
function postFetchAction() {
var formData = new FormData();
formData.append('value', 'food');
formData.append('pageSize', 4);
formData.append('pageNum', 1);
var options = {
// 则header 不需要设置 "content-type": "application/json"
headers: {},
method: "POST", // *GET, POST, PUT, DELETE, etc.
mode: "cors", // no-cors, cors, *same-origin,
body: formData
};
fetch("http://localhost:8080/dictionary/searchDictionary", options)
.then(function(res) {
debugger;
console.log(res);
// 这个函数返回的是接口响应的值,执行后面的then 方法
return res.json();
})
// 第二个 then 才是获取后台实际返回的结果
.then(function(response) {
debugger;
console.log(response);
});
}