liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.9k stars 214 forks source link

请求报错,在postman或者网页上直接输入能请求成功 #95

Closed jianxiaobai999 closed 2 years ago

jianxiaobai999 commented 2 years ago

问题描述

请求报错:com.drake.net.exception.HttpFailureException

期望行为

希望看一下为什么会这样

如何复现

请求下面地址: http://*****

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

liangjingkanji commented 2 years ago

希望你发出HttpFailureException包含的堆栈信息, 它包含具体错误信息

内核是完全使用的okHttp基本上不会出现请求相关问题, 请仔细检查堆栈信息描述

liangjingkanji commented 2 years ago

你使用标签过滤掉了, 请查看完整的错误堆栈信息而不是OKPRFL_

liangjingkanji commented 2 years ago
  1. HttpFailureException该类表示Http请求在服务器响应之前失败, 例如无网络
  2. HttpResponseException该类表示Http请求在服务器响应成功后失败
jianxiaobai999 commented 2 years ago
  1. HttpFailureException该类表示Http请求在服务器响应之前失败, 例如无网络
  2. HttpResponseException该类表示Http请求在服务器响应成功后失败

可以保证网络良好,换其他地址,访问正常,你说的日志这个快,我没有找到更多相关信息。。。

liangjingkanji commented 2 years ago

你使用Net_LOG来过滤日志或者查看当前应用的所有日志

liangjingkanji commented 2 years ago

看样子是你自定义输出错误信息, 但是只输出message导致没有堆栈信息了

image

你看你都把TAG改成了"错误", 你应当保留堆栈信息来便于排查问题的

jianxiaobai999 commented 2 years ago

我是把请求的Get().awit()代码try catch 了用的普通log打印的错误信息

liangjingkanji commented 2 years ago

请保留堆栈信息(没有该信息无法排错), 比如如下代码

Log.e("NET_TAG", "捕获错误", e)
liangjingkanji commented 2 years ago

这是具体错误原因, java.io.IOException : unexpected end of stream on

我这里尝试没有请求200没有任何问题, 你得自己排查了这不是Net导致的问题, 如果你觉得有疑问可以使用OkHttp标准请求方法尝试

jianxiaobai999 commented 2 years ago

java.io.IOException : unexpected end of stream on

这个错误我该怎么处理,我用Get返回string

jianxiaobai999 commented 2 years ago

这个是说我地址错误?

liangjingkanji commented 2 years ago

返回string那不就请求成功了?

jianxiaobai999 commented 2 years ago

不是,我意思是,我请求这个地址要返回个string,单结果是报这个错了,这个错是因为我请求地址有问题吗

liangjingkanji commented 2 years ago

这个错误你搜索吧, 服务器在返回数据给你的时候意外终止流导致的异常, 问题不在于客户端

而且我无法复现你的异常, 你可以尝试去除一些不必要参数(使用Net的demo来发起请求)或者使用Postman等工具进行问题排查

jianxiaobai999 commented 2 years ago

百度了一下说是请求的url可能有问题,但是我的地址本来就是这样的,你在demo中没有复现吗,用我的那个地址?

liangjingkanji commented 2 years ago

有问题先用demo复现吧, 我没有多余精力或时间来猜测或者排查业务问题

jianxiaobai999 commented 2 years ago

有问题先用demo复现吧, 我没有多余精力或时间来猜测或者排查业务问题

好的,我在看看吧,谢谢

liangjingkanji commented 2 years ago

我建议你发生网络请求错误先用接口测试工具然后使用Net的demo来复现, 避免本地网络导致的问题影响你的判断

网络问题很多的, 甚至可能是OkHttp自身问题

jianxiaobai999 commented 2 years ago

我建议你发生网络请求错误先用接口测试工具然后使用Net的demo来复现, 避免本地网络导致的问题影响你的判断

网络问题很多的, 甚至可能是OkHttp自身问题

嗯嗯,我用postman或网页直接访问,都正常的,项目中不行,估计demo也一样,毕竟就是个简单的请求

liangjingkanji commented 2 years ago

你实际项目中很可能默认自带很多请求头, 这些多余参数可能也会导致问题发生

所以请使用没有任何多余请求参数的请求来排查问题, 还有问题请使用OkHttp原始请求, 还有问题那就属于OkHttp的了

Net基本上没有对请求做干预, Netv3运行到至今没有出过网络相关bug

jianxiaobai999 commented 2 years ago

应该就是库的问题了,我用Net.get()方法请求返回string正常,用Get().awit()返回字符串就不正常

liangjingkanji commented 2 years ago

那你fork复现问题, 我来看

liangjingkanji commented 2 years ago

希望你用OkHttp原始请求尝试一次

jianxiaobai999 commented 2 years ago

经过多次验证,发现是因为设置了两次user-agent的原因,在全局拦截设置了header 在请求的时候设置了专用的header,就出现这个地址请求失败的问题了,这个是什么原理,设置两次user-agent就无法访问

jianxiaobai999 commented 2 years ago

我看Net框架请求日志上是把两个user-agent拼接后请求的,如果拼接后是设置了一个user-agent的话应该是可以访问的,但实际上不能访问,是因为框架在请求的时候还是按照两个user-agent请求的吗,这个有解决方法吗

liangjingkanji commented 2 years ago

请求头可以通过addHeader拼接成数组是常识,你应该使用setHeader来覆盖

jianxiaobai999 commented 2 years ago

请求头可以通过addHeader拼接成求组是常识,你应该使用setHeader来覆盖

明白了,是我的问题,谢谢

liangjingkanji commented 2 years ago

希望你多自己仔细排查问题,我已经多次建议过fork复现问题了,而不是第一时间问我为什么,因为这个项目是开源的

jianxiaobai999 commented 2 years ago

好的,我会多看看的,这个问题看了好久没找出原因,,我还想问一下就是都用setHeader(),最后的请求会在拦截器里覆盖成全局的header,这个怎么处理呀

liangjingkanji commented 2 years ago

覆盖全局不就是应该的吗?我不太知道你要怎么处理

jianxiaobai999 commented 2 years ago

全局的header 不应该是处理成可以被单独的特定请求的header覆盖才好点吗,就像设置的全局baseUrl 可以被请求得完整得http://**地址覆盖一样

liangjingkanji commented 2 years ago

拦截器在请求之后,你先弄明白先后顺序,所有网络请求都如此,你可以自己添加标签去在拦截器判断

jianxiaobai999 commented 2 years ago

哦哦,明白了