springboot @RequestBody注解学习

文章引用

  1. @RequestBody的使用

功能介绍

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);

GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

如果@RequestParam()的用法不理解,请参考——《springboot controller接收参数》

JSON字符串转换对象的逻辑

  1. 后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)

  2. json字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。

  3. json字符串中,如果value为null的话,后端对应收到的就是null。

  4. 如果某个参数没有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);
	});
}
使用postman 的方法

在这里插入图片描述

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值