Android retrofit 注解@QueryMap和@Body的区别

 我来答
优就业刘老师
2017-09-18 · 超过13用户采纳过TA的回答
知道答主
回答量:14
采纳率:0%
帮助的人:20.6万
展开全部

1.使用retrofit这样框架快一年了,以前使用它传递参数时都是用@QueryMap注解传递,虽然知道这样不是很好,但是当时换框架的时候看到工作量太大就没有换成实体类形式了,之前的使用方式如下图:

2.由于最近在研究java后台,搭建了一个SSM框架想测试一下;因为之前以为HashMap只能采用这种方式传递,在今天的测试中发现并不是,其实使用HashMap同样可以采用@Body注解,而且@QueryMap跟@Body的区别非常大,先看按之前的方式使用@QueryMap:

3.上面是android的代码,使用了RxJava。在来看java后台的:

4.使用HttpServletRequest来接收是没有问题的,但是如果后台使用@RequestBody来接收参数就没法接收到了,而且连请求都没接收到:

5.下面我们来看一下,android
Studio打印的日志,发现后台返回了400,并且发现参数拼接到连接后面了,这不是GET的传递参数的方式吗?但是我明明是POST注解请求:

6.我点击注解看了下源码,看到下面的注释,第一句的大意就是说:会把key和value拼接到url后面,所以才会出现刚刚日志中那种情况,而且看注释都是在讲GET请求下的使用,并没有POST的使用介绍,所以我感觉这个注解是主要为GET请求准备的:

7.在来看@Body,先看源码吧 ,注释的大体意思是:使用这个注解可以把参数放到请求体中,适用于 POST/PUT请求:

8.然后再看使用方式,和@QueryMap 一样的,而且它可以使用实体类,QueryMap 是不能注解实体类的:

9.在看打印的日志:

10.从日志看出来,这才是POST请求参数参数的方式。

总结一下:@QueryMap注解会把参数拼接到url后面,所以它适用于GET请求;@Body会把参数放到请求体中,所以适用于POST请求。

如果你的项目是采用POST请求方式,不管是使用实体类还是使用HashMap最好采用@Body注解。虽然你使用QueryMap
可能也不会有什么问题(PS:这种共用的情况只适用于POST请求,GET请求不能使用@Body注解,否则会报错)。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式