@RequestBody 和@RequestParam 的使用问题

news/2024/7/19 15:03:59 标签: js, java, post, javascript

1、@RequestBody注解,内部使用RequestResponseBodyMethodProcessor进行解析,此参数解析器用HttpMessageConverter将HttpMessage封装为具体的JavaBean对象。
      @RequestBody 一般用于post请求,处理body体中的数据,headers中 Content-Type 设置为 application/json或 application/xml,后端根据前端传输的数据结构使用自定义的实体类或者map接收。

var request = require("request");
var options = { method: 'POST',
  url: 'http://10.0.13.63:8086/my_prop/getInfo2',
  headers:{'Content-Type': 'application/json' },
  body: { code: 'no1001', name: 'lily' },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
------------------------后端----------------------------
	@SuppressWarnings("serial")
	@PostMapping("getInfo2")
	public Object getInfo2(@RequestBody Map<String,String> map) {
		
		return new HashMap<String,String>(){{
			put("new_name","lily");
			put("new_code","no1001");
			put("name",map.get("name"));
			put("code",map.get("code"));
		}};
	}
-----------------------返回-----------------------------
{
    "code": "no1001",
    "name": "lily",
    "new_code": "no1002",
    "new_name": "lily2"
}

  
   get请求也可以使用,参数放在body中,headers中 Content-Type 同样设置为 application/json 或 application/xml,
   PS:之前一直认为get请求参数不能放body中,实验了下才知道可以,设置好请求头,使用@RequestBody 就可以接收到

var request = require("request");
var options = { method: 'GET',
  url: 'http://10.0.13.63:8086/my_prop/getInfo2',
  headers: 
   { 'Content-Type': 'application/json' },
  body: { code: 'no1001', name: 'lily' },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

------------java--------------
@SuppressWarnings("serial")
@GetMapping("getInfo2")
public Object getInfo2(@RequestBody Map<String,String> map) {
		
	return new HashMap<String,String>(){{
		put("new_name","lily2");
		put("new_code","no1002");
		put("name",map.get("name"));
		put("code",map.get("code"));
	}};
}
--------------返回--------------
{
    "code": "no1001",
    "name": "lily",
    "new_code": "no1002",
    "new_name": "lily2"
}

  如果 Content-Type 是 application/x-www-form-urlencoded ,其实@RequestBody也是能接收到数据的,只是此时@RequestBody需要将body中的所有数据都作为一个字符串接收
 

var request = require("request");

var options = { method: 'GET',
  url: 'http://10.0.13.63:8086/my-prop/getInfo3',
  headers: 
   {'Content-Type': 'application/x-www-form-urlencoded' },
  form: { name: 'jack', code: 'no001', undefined: undefined } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
---------------------------------------------
	@SuppressWarnings("serial")
	@GetMapping("getInfo3")
	public Object getInfo3(@RequestBody String name) {
		
		return new HashMap<String,String>(){{
			put("new_name","lily2");
			put("new_code","no1002");
			put("name",name);
		}};
	}
-------------------------------------------
{
    "name": "name=jack&code=no001",
    "new_code": "no1002",
    "new_name": "lily2"
}

如果前端传的是一个复杂对象,后端不方便使用一个简单实体类接收,又不想再创建一个复杂实体类的时候,可以使用Map<String,Object>接收,在转化传为对应的实体类。

2、@RequestParam 一般用于get请求, 处理params 中的数据,即URL后面的xxx=xxxx&yyyy=yyyy, 使用多个@RequestParam String xxx 接收,或者Map<String,String> map全部接收。

     @RequestParam也可处理post请求中body中的数据,只要将Content-Type 设置为 application/x-www-form-urlencoded 即可。

注:@RequestBody 注解一个方法中只能使用一个, @RequestParam注解一个方法中可以存在多个, @RequestBody 可以和@RequestParam同时存在于一个方法中,一个处理body中的数据,一个处理params 中的数据,一般不建议这样做。
注:前端使用params 或者 body application/x-www-form-urlencoded 方式传值,后端如果想用自定义的实体类接收,去掉@RequestParam注解即可,spring 会自动处理。

@SuppressWarnings("serial")
	@PostMapping("getInfo4")
	public Object getInfo4(SsoUser ssoUser) {
		return new HashMap<String,String>(){{
			put("new_name","lily");
			put("new_code","no1001");
			put("code",ssoUser.getPassword());
			put("name",ssoUser.getAccount());
		}};
	}

 


http://www.niftyadmin.cn/n/806604.html

相关文章

项目学习2

第二天了&#xff0c;感觉还好了&#xff0c; 但是总感觉慢半拍的&#xff0c;没事&#xff0c;挑战自己哈。 委托事件模型&#xff1a;1 事件源 2监听器 步骤&#xff1a; 1 建立事件源&#xff0c;比如按钮。 2 为事件源寻找合适的监听器&#xff0c; 3为监听器添加适当的处…

Zookeeper特性与分布式锁(含安装与集群搭建)

前言&#xff1a;本文为原创 若有错误欢迎评论&#xff01; 一.安装 1.linux安装&#xff08;非Docker&#xff09; 下载zookeeper-3.4.14.tar.gz&#xff08;https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1…

微信原生开放域实现排行榜、好友送礼

在使用Cocos Creator制作微信小游戏的时候&#xff0c;基本上都是需要排行榜功能的。鉴于如果使用Cocos Creator官方提供的WxSubContextView&#xff0c;会增大不少开放域包体。如果本身主域工程的包体已经有点大&#xff0c;并且还不想用分包加载的话&#xff0c;那么可以考虑…

Vue前端接收后台二进制文件的方式

1.如果是是get请求&#xff0c;且参数只有很少,例如&#xff1a; location.href ${process.env.VUE_APP_API_BASE_URL}xxx/xxxx/printOrderPdf?id${this.baseInfo.id} 2.如果是post请求&#xff0c;或者参数很多则&#xff1a; this.$http({method: post,url: xxx/xxx/pr…

Win10总是自动下载更新系统,该如何关闭?

原&#xff1a;http://www.chinaz.com/news/2015/0826/438617.shtml 对于已经过升级到Windows10系统的用户来说&#xff0c;相信都有遇到这么一个情况&#xff0c;有时一关机&#xff0c;总会看到电脑迟迟不进入关机状态&#xff0c;而是提醒不要断电&#xff0c;电脑正在配置更…

C++ 11 笔记 (二) : for循环

首先肯定的是&#xff0c;我不是标题党。。 C11的for循环确实有跟C98不一样的地方&#xff0c;还是先上代码&#xff1a; 1 int test_arr[] { 1, 2, 3, 4, 5 }; 2 for (int x : test_arr) 3 { 4 std::cout << x << std::endl; 5 } 看上去跟Java的for循环和C#的…

Dubbo常用组件及高级特性(Zookeeper作注册中心整合)

前言&#xff1a;本文为原创 若有错误欢迎评论&#xff01; 一.ZookeeperDubbo整合 Zookeeper作注册中心 则每个dubbo服务会去zookeeper注册一个节点&#xff1a; /dubbo/服务包名/服务的application.name的名字/ 1.依赖 <properties><spring-boot.version>2.1.6.…

谁说游戏是程序员写的?

从我们第一阶段【筑基】完成作业的伙伴可以直接飞升第二阶段啦&#xff01;7月1日【辟谷】期正式开营&#xff01;Creator修仙模拟三步曲&#xff1a;筑基—软件运用辟谷—设计思维金丹—编程开发先看一下辟谷阶段的学习内容&#xff1a;学习 Cocos Creator 引擎组件化设计游戏…