OkHttp 不断收到 StreamResetException: stream was reset: INTERNAL_ERROR when it's 200

Posted

技术标签:

【中文标题】OkHttp 不断收到 StreamResetException: stream was reset: INTERNAL_ERROR when it\'s 200【英文标题】:OkHttp keeps getting StreamResetException: stream was reset: INTERNAL_ERROR when it's 200OkHttp 不断收到 StreamResetException: stream was reset: INTERNAL_ERROR when it's 200 【发布时间】:2021-03-16 03:08:02 【问题描述】:

我从 OkHttp 获得了StreamResetException: stream was reset: INTERNAL_ERROR。有什么问题?

这是日志。

I/okhttp.OkHttpClient: <-- 200 https://www.example.com/user/list (396ms)
I/okhttp.OkHttpClient: date: Fri, 04 Dec 2020 02:21:35 GMT
I/okhttp.OkHttpClient: content-type: application/json
I/okhttp.OkHttpClient: content-length: 99730
I/okhttp.OkHttpClient: server: nginx/1.18.0
I/okhttp.OkHttpClient: allow: GET, HEAD, OPTIONS
I/okhttp.OkHttpClient: x-frame-options: DENY
I/okhttp.OkHttpClient: x-content-type-options: nosniff
I/okhttp.OkHttpClient: referrer-policy: same-origin
D/okhttp.Http2: << 0x00000003  5792 DATA          
D/okhttp.Http2: << 0x00000003     4 RST_STREAM    
D/okhttp.TaskRunner: Q10092 canceled              : OkHttp ConnectionPool
D/force: okhttp3.internal.http2.StreamResetException: stream was reset: INTERNAL_ERROR
D/okhttp.Http2: >> 0x00000000     8 GOAWAY     
D/okhttp.TaskRunner: Q10096 finished run in 216 ms: OkHttp www.example.com

这是在 Okhttp Gihub 存储库中发布的。但是还没有解决任何问题。

我是这样调用 API 的

    @Headers("Content-Type: application/json")
    @GET("/user/list")
    fun getUserList(@Header("Authorization") jwt: String): Call<ArrayList<UserData>>

这是 200,但我什么也没得到。这是非常奇怪的行为..

是服务器问题还是我的问题? (服务器是 Django)。

【问题讨论】:

【参考方案1】:

这是 Nginx 缓冲区大小问题。

如果您使用的是 AWS EC2,

转到/etc/nginx/default.d/server.conf

然后设置,

proxy_redirect off;
proxy_buffering off;

【讨论】:

【参考方案2】:

正如 OkHttp 问题跟踪器中所建议的,这很可能是发送标头后的服务器错误。

https://github.com/square/okhttp/issues/3936

通常错误代码由服务器发送以指示服务器端出现问题。如果 OkHttp 的流阅读器因意外异常而崩溃,也可能发生这种情况。

如果可以,我建议检查服务器错误,但您可以在此处查看来自服务器的 Http2 帧

D/okhttp.Http2: << 0x00000003     4 RST_STREAM  

【讨论】:

【参考方案3】:

StreamResetException:服务器发送错误代码以指示服务器端出现问题。这可能是由于 Nginx 缓冲区大小问题,如果单个服务器过载多个请求也可能发生

【讨论】:

以上是关于OkHttp 不断收到 StreamResetException: stream was reset: INTERNAL_ERROR when it's 200的主要内容,如果未能解决你的问题,请参考以下文章

okhttp 获取失败响应

即使 OkHttp 不是依赖项,OkHttp 连接泄漏日志行

okhttp请求超时无效问题

检查互联网连接 OKHTTP

如何将 OkHttp 日志记录到 Crashlytics

Retrofit/OkHTTP/RxJava 间歇性 InterruptedIOException