Retrofit Post请求参数为Json

16 篇文章 0 订阅

Retrofit请求Post请求参数说明
1. 说明:
Retrofit网络框架使用注解支持多种请求方式,请求参数也是注解实现的;这里主要讲解Post请求时的参数设置,涉及注解@Field、@FieldMap、@FormUrlEncoded、@Body

2. POST请求简介:
HTTP请求有GET、POST、PUT、DELETE、HEAD、OPTIONS…等,其中GET请求使用明文URL获取服务端对应资源,PUT请求为服务器新增一条数据,DELETE请求服务端删除某条数据,HEAD请求仅返回请求头,可以检测被访问资源是否存在;而POST请求是以表单数据等形式,以请求体访问服务端,请求服务端处理:

POST发送数据给服务器处理,数据包含在HTTP信息正文中
POST请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。
POST方法可能会创建新的资源或/和修改现有资源。
使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:例如

POST /test/demoform.html HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

我们的POST请求参数name1=value1&name2=value2在请求体中携带而非直接追加在url末尾,这也是与GET请求最大的区别;

POST 特点:
POST请求不能被缓存下来
POST请求不会保存在浏览器浏览记录中
以POST请求的URL无法保存为浏览器书签
POST请求没有长度限制
3. Retrofit POST请求示例:
接口规范如图所示:

所以请求是POST类型,JSON格式提交数据,同时需要请求头参数

3.1 构建接口类

因此构建Retrofit接口类如下:(这里包括以键值对和json数据形式提交数据的方式)

    interface Api {
        /**
         * 使用@Body注解作为参数
         */
        @POST("/user/updateUserInfo")
        Observable<BaseModel> updateUserInfo3(@Body RequestBody body);
        
        /**
         * 使用@Field注解作为参数
         */
        @FormUrlEncoded //@Field参数 一定需要这个注解
        @POST("/user/updateUserInfo")
        Observable<BaseModel> updateUserInfo1(@Field("phone") String phone, @Field("isUpdated") String isUpdated);

        /**
         * 使用@FieldMap注解作为参数
         */
        @POST("/user/updateUserInfo")
        Observable<BaseModel> updateUserInfo2(@FieldMap() Map param);
    }

 

3.2 请求结果展示
@Body注解
方法1:使用对象获取json数据

    UserInfoBean userInfoBean = new UserInfoBean("18808086666", "1");
    RequestBody body = FormBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(userInfoBean));
    //接口对象实例调用相关接口,获得Observable对象
    Observable<BaseModel> observable = api.updateUserInfo3(body);


方法2:使用map获取json数据

    HashMap<String, Object> map = new HashMap<>();
    map.put("phone", "18808086666");
    map.put("isUpdated", "1");
    RequestBody requestBody = RequestBody.create(MediaType.parse("Content-Type, application/json"), new JSONObject(map).toString());
    //接口对象实例调用相关接口,获得Observable对象
    Observable<BaseModel> observable = api.updateUserInfo3(body);


日志结果:

D/OkHttp: --> POST http://****/user/updateUserInfo http/1.1
D/OkHttp: Content-Length: 39
D/OkHttp: User-Agent: Mozilla/5.0 (Linux; Android 9; COL-AL10 Build/HUAWEICOL-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36
D/OkHttp: Authorization: M2I0OTU4OTQ3NjY0MDNmURRmNmUwN2Qw 
D/OkHttp: {"phone":"18808086666","isUpdated":"1"}
D/OkHttp: --> END POST (39-byte body)
D/OkHttp: <-- 200  http://****/user/updateUserInfo (40ms)
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Transfer-Encoding: chunked 
D/OkHttp: Date: Fri, 26 Apr 2019 03:36:15 GMT
D/OkHttp: Cache-Control: public, max-age=3600
D/OkHttp: {"code":"1000","msg":"请求成功","data":""}
D/OkHttp: <-- END HTTP (46-byte body)

重点关注:{"phone":"18808086666","isUpdated":"1"},说明提交参数为json字符串

@Field注解
调用接口,传入参数

    Observable<BaseModel> observable = api.updateUserInfo1("18808086666", "1");

日志结果

    D/OkHttp: --> POST http://****/user/updateUserInfo http/1.1
    D/OkHttp: Content-Type: application/x-www-form-urlencoded
    D/OkHttp: Content-Length: 29
    D/OkHttp: User-Agent: Mozilla/5.0 (Linux; Android 9; COL-AL10 Build/HUAWEICOL-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36
    D/OkHttp: Authorization: M2I0OTU4OTQ3NjY0MDNmURRmNmUwN2Qw 
    D/OkHttp: phone=18808086666&isUpdated=1
    D/OkHttp: --> END POST (29-byte body)
    D/OkHttp: <-- 415  http://****/user/updateUserInfo (31ms)
    D/OkHttp: Content-Type: application/json;charset=UTF-8
    D/OkHttp: Transfer-Encoding: chunked
    D/OkHttp: Date: Fri, 26 Apr 2019 06:53:47 GMT
    D/OkHttp: Cache-Control: public, max-age=3600
    D/OkHttp: {"timestamp":1556261627312,"status":415,"error":"Unsupported Media Type","message":"Content type 'application/x-www-form-urlencoded' not supported","path":"/user/updateUserInfo"}
    D/OkHttp: <-- END HTTP (178-byte body)


重点关注:phone=18808086666&isUpdated=1,这就是键值对形式提交数据;
最终结果是:错误码415,Unsupported Media Type,同时指出这个请求的conten type是Content type 'application/x-www-form-urlencoded',与1上面的Content-Type: application/json的区别不言而喻;

@FieldMap注解
与@Field大同小异,区别是请求参数为map,

HashMap<String, Object> map = new HashMap<>();
map.put("phone", "18808086666");
map.put("isUpdated", "1");
Observable<BaseModel> observable = api.updateUserInfo2(map);

日志结果也是一样的

4 总结:
@File,@FieldMap参数提交的类型是'application/x-www-form-urlencoded'
@Body参数提交的类型是'application/json'
做为开发人员,开发需求前需要彻底澄清前后端接口的细节;这个例子就涉及到请求方式,请求头,请求参数类型等;如果理解有偏差就会造成想当然的错误

————————————————
版权声明:本文为CSDN博主「Linx2018」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40087231/article/details/89554649

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值