美文网首页
retrofit遇到/n和//n

retrofit遇到/n和//n

作者: 半城繁华_半城伤 | 来源:发表于2019-08-28 15:00 被阅读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!

    相关文章

      网友评论

          本文标题:retrofit遇到/n和//n

          本文链接:https://www.haomeiwen.com/subject/iukisctx.html