retrofit遇到/n和//n

2019-08-28  本文已影响0人  半城繁华_半城伤

突然收到测试反馈:提交文章内容,换行消失了,出现了一大堆的/n是什么鬼? 

一、分析原因:

1、retrofit在post时请求体问题。

2、请求体中传值时编码格式是否与后台有差异

检查代码:

@POST(Constants.FILE_API_URI + "addcommunity")

Observable<Result> communityCreate(@Body CommunityRequest request)

如果仅仅不含文件类上传,以上即可满足。不会出现被替换情况。

二、还原错误代码

@POST(" ...")Observable<Result> communityCreate(@Query("token") String token,  @Query("content") String content,@Part MultipartBody.Part file);

a、当请求体是@Body时没有遇到换行符被替换情况,是否是请求符问题。

b、当请求体是@Query时出现了被替换的情况(提示:以@Query进行post请求时,参数会直接拼接在请求链接上。HTTP协议规范没有对URL长度进行限制。但是是特定的浏览器及服务器对它的限制。比如:Google的URL最大长度限制为8182个字符。)

三、代码更正

@POST(" ...")Observable<Result> communityCreate(@Query("token") String token, @Part(value = "content",encoding = "utf-8") String content,@Part MultipartBody.Part file);

a、填加数据的编码格式,前后对比,问题依然出现,排除编码格式不一致

b、修改@Query为@Part后请求体,提交的数据将会以表单的形式提交。但是问题依旧出现

深吸一口气继续探究:

四、log查看,服务器数据比对。

log log

查看提交的数据前后两条提交的数据都是一样的。再看下服务器中接收到的数据:

service_data

What!!!我给的数据都是一样的。为啥到了服务器上,接收到的怎么就不一样了。弱弱的嘀咕一句:怎么写的接口!!!

本着不能得罪后台大大的原则,踏上了给后台填坑之路。

五、最终解决方案:将String类型——更改为媒体对象RequestBody

@POST(" ...")Observable<Result> communityCreate( @Query ("token") String token, @Part(value = "content",encoding = "utf-8") RequestBody content,@Part MultipartBody.Part file); 

六、分析,思考原因:

问题:1、为什么@Body可以,@Query,@Part不行?

问题: 2、为什么@Part下的String字符串类型不行,Request可以?

主要涉及到后端对应的Spring一点知识点:

在Java中,后台接收数据的Controller中,通常会使用@RequestBody与@RequestParam()来接收数据。而RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数。

在.Net中后台采用了对象的形式进行数据接收,类似于Java中的@RequestBody。

综上:
使得在后台进行数据接收时@Body可以,其他不行。

如果使用@Part时也要使用RequestBody。而使用RequestBody时,后台接收以媒体流的格式,将String类型转换

RequestBody.create(MediaType.parse("text/plain"), s)

以上总结不到位,有误。望指正,Thanks!

上一篇下一篇

猜你喜欢

热点阅读