400 Bad Request引发的思考

好久没写了,因为最近有点迷茫,不知道为什么会迷茫😭求解。。。。。。哈哈,不管了进入正题,今天翻抖音看到一个视频说距离2019年春节还有99天, HA的我到公司后赶紧算了一下确实是🙂,马上就一年了,年初定的小      目      标🤭,“( ̄▽ ̄)” 一个表情说明一切。

最近在简书上看到一个Retrofit2+Rxjava2+okhttp3封装的项目,下面评论里面有一条说运行后返回结果是400,博主回复里说是onNext()方法里数据转换的问题。以往的认知认为返回以4开头的状态码一般考虑服务端没有正确的返回,会不会是请求的链接有问题或者是服务端代码没有处理好等等,既然以4开头了就不应该会回调onNext()方法应该是走onError()方法才对啊。

呵呵🙂本着学习的态度我又一次来“装逼”了,按评论里的描述修改代码然后编译运行这个项目发现确实是返回400 Bad Request,又一想会不会是我自己的想法是错误的,于是又按照博主的建议首先在onNext()方法打断点调试发现程序根本不会回调onNext()方法,看来我的思路是正确的,然后看一下具体的异常是:retrofit2.adapter.rxjava2.HttpException: HTTP 400 Bad Request,有了具体的异常信息接下来看一下网上我搜索到的解决该异常的方法:

方法一:https 协议下,在url 中含有特殊符号 |,于是抛出了如下错误;但是 在http 协议下倒是不会出现该问题,查看后发现Retrofit 注解 在post 使用的时候需要 @FormUrlEncoded() + @FieldMap(),而不是使用 @QueryMap()该方法出处

这种我把https换成http后,还是会出现同样的问题,而我把get请求换成post并且加@FormUrlEncoded注解然后把@QueryMap()替换成@FieldMap()后问题解决了。

方法二:最近项目中遇到一件怪事,在get请求中发现没有数据,在debug时候发现居然报了一个retrofit2.adapter.rxjava

.HttpException: HTTP 400错误。经过查阅资料发现400 请求出错。由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。但是我把请求的完整参数发到postman中请求发现没有问题。正在觉得怪异的时候,请求参数中|这个特殊字符串引起了我的注意。通过在OKhttp 拦截器中打印出本次请求路径发现,所有的参数都是被编码了,但是|这个特殊字符却没有编码

String path = "";
try {
LogUtils.error("path" + departmentBean.getPath());
path = new String(departmentBean.getPath().getBytes(), "utf-8");
path = URLEncoder.encode(path, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

通过对路径参数也就是包含 | 特殊字符的参数进行编码过后问题就解决了。该方法出处

这种方法通过测试我发现无效,可能是我添加的位置不对还是什么原因,不是很清楚。

接下来我想说一下我的解决方案:既然是服务器没有正确返回,首先查看链接是否正确,然后在看代码中有没有其他什么

地方会影响到整个和服务器的交互,很快会想到拦截器:Interceptor,然后去代码中查看有关拦截器的代码发现有一处代码是headerInterceptor,我想问题应该就是在这吧,开始动手修改,去掉这段拦截器的代码,编译运行成功,😄说明问题找到了,然后在看这块问题出在哪,Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型,这个参数会引出另一个问题,稍后再说。Accept:指定客户端能够接收的内容类型,这个没问题客户端接收的就是json类型,接下来的Content-Type:请求的与实体对应的MIME信息,这里有一篇不错的介绍Content-Type的文章:https://blog.csdn.net/danielzhou888/article/details/72861097 其中有一句比较符合这个问题的描述:application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式),然后再看我们的get请求链接不就是在链接的后面以这种key/value的形式发送的吗,🙂好了,把代码中的Content-Type的值换成application/x-www-form-urlencoded问题解决。主要是针对get请求哈,post请求的话用application/json就没问题了。

上面提到的Accept-Encoding的问题就是乱码的问题,这里有一篇文章介绍这个很不错https://blog.csdn.net/xx326664162/article/details/81661861直接去掉,简单    粗暴    完美,符合大多数想解决问题的小伙伴的想法:越简单解决越好。

结束,笔芯  笔芯   笔芯

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章