突然收到测试反馈:提交文章内容,换行消失了,出现了一大堆的/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_dataWhat!!!我给的数据都是一样的。为啥到了服务器上,接收到的怎么就不一样了。弱弱的嘀咕一句:怎么写的接口!!!
本着不能得罪后台大大的原则,踏上了给后台填坑之路。
五、最终解决方案:将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!
网友评论