美文网首页
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

    突然收到测试反馈:提交文章内容,换行消失了,出现了一大堆的/n是什么鬼? 一、分析原因: 1、retrofit在p...

  • \n和\r\n

    在学Swift基本类型的时候发现在String Interpolation[https://docs.swift....

  • 字节一面二面记录

    一面: 算法: 1、n! 2、实现 double base 的 int expand 次幂 retrofit原理:...

  • 算法面试题目

    面试中遇到了好多算法题目:1>一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5...

  • 遇见你然后我遇见我自己

    N年前我遇到了初恋,N年前我进去了婚姻的殿堂,N年前我做了父亲,N年前我恢复了自由身,现在的我又遇到了你,我希望我...

  • 难(nàn/nǎn)

    距离上篇文章已经两天了。 两天,四十八小时,两千八百八十分钟,十七万二千八百秒……发生了很多事。 在一天的勤奋后,...

  • leetcode 172 题解及感想

    刷leetcode遇到此题,明白直接求n!是不行的,必然会导致溢出。转变思想之后,发现n=n x (n-1) x ...

  • SICP——构造程序抽象(三)

    1.线性的递归和迭代 先从阶乘的问题入手,计算n的阶乘(n!),也就是: n!=n*[(n-1)*(n-2)*(n...

  • LeetCode之Minimum Operations to M

    问题: 方法:当n是奇数时,可知操作次数等于n - 1, n - 3, n - 5.. n - n的和,所以通过等...

  • \r和\n,以及\r\n

    \n是换行,英文是New line,表示使光标到行首\r是回车,英文是Carriage return,表示使光标下...

网友评论

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

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