OkHttp Android流已重置:需要HTTP_1_1_

OkHttp Android流已重置:需要HTTP_1_1_,android,azure,okhttp3,http2,azure-app-service-plans,Android,Azure,Okhttp3,Http2,Azure App Service Plans,我们正在开发一个Android应用程序,它应该使用Http/2连接到我们的Azure应用程序服务。 在Azure应用程序服务上,我们使用以下博文中的步骤启用了Http/2: 我们的请求由相互SSL保护,因此应用程序必须发送其客户端证书 当我们尝试使用OkHttp执行对我们的应用程序服务的调用时,我们总是会得到以下错误和堆栈跟踪。当我们尝试使用相同的Android代码调用twitter api时,这是可行的 有人知道如何解决这个问题吗 我们使用的是OkHttp版本3.10.0 Stacktrace

我们正在开发一个Android应用程序,它应该使用Http/2连接到我们的Azure应用程序服务。 在Azure应用程序服务上,我们使用以下博文中的步骤启用了Http/2:

我们的请求由相互SSL保护,因此应用程序必须发送其客户端证书

当我们尝试使用OkHttp执行对我们的应用程序服务的调用时,我们总是会得到以下错误和堆栈跟踪。当我们尝试使用相同的Android代码调用twitter api时,这是可行的

有人知道如何解决这个问题吗

我们使用的是OkHttp版本3.10.0

Stacktrace:
06-08 15:54:00.173 31318-31351/be.wgkovl.evdt W/be.wgkovl.evdt.utils.BaseService: stream was reset: HTTP_1_1_REQUIREDokhttp3.internal.http2.StreamResetException: stream was reset: HTTP_1_1_REQUIRED at okhttp3.internal.http2.Http2Stream.takeResponseHeaders(Http2Stream.java:153) ~[na:0.0] at okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:125) ~[na:0.0] at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0] at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0] at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0] at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0] at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0] at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0] at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200) ~[na:0.0] at okhttp3.RealCall.execute(RealCall.java:77) ~[na:0.0] at be.wgkovl.evdt.utils.BaseService.executeRequest(BaseService.java:277) ~[na:0.0] at be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:123) ~[na:0.0] at be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:101) ~[na:0.0] at android.os.AsyncTask$2.call(AsyncTask.java:295) ~[na:0.0] at java.util.concurrent.FutureTask.run(FutureTask.java:237) ~[na:0.0] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) ~[na:0.0] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) ~[na:0.0] at java.lang.Thread.run(Thread.java:818) ~[na:0.0] 06-08 15:54:00.173 31318-31351/be.wgkovl.evdt W/be.wgkovl.evdt.utils.BaseService:流被重置:HTTP_1_1_REQUIREDokhttp3.internal.http2.StreamResetException:流被重置:HTTP_1_1_REQUIRED 在okhttp3.internal.http2.Http2Stream.takeResponseHeaders(Http2Stream.java:153)~[na:0.0] 在okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:125)~[na:0.0] 在okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:147)~[na:0.0] 在okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:147)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:121)~[na:0.0] 在okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:147)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:121)~[na:0.0] 在okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:147)~[na:0.0] 在okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:147)~[na:0.0] 在okhttp3.internal.http.RealInterceptorChain.procedure(RealInterceptorChain.java:121)~[na:0.0] 在okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)~[na:0.0] 在okhttp3.RealCall.execute(RealCall.java:77)~[na:0.0] 在be.wgkovl.evdt.utils.BaseService.executeRequest(BaseService.java:277)~[na:0.0] 在be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:123)~[na:0.0] 在be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:101)~[na:0.0] 在android.os.AsyncTask$2.call(AsyncTask.java:295)~[na:0.0] 在java.util.concurrent.FutureTask.run(FutureTask.java:237)~[na:0.0] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)~[na:0.0] 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)~[na:0.0] 在java.lang.Thread.run(Thread.java:818)~[na:0.0]

HTTP/2目前并不真正支持客户端证书,尤其是当此类连接仅应用于服务器上的某些资源时。有,但还没有标准化,而且,至少还没有任何实施支持

在支持此操作之前,请使用HTTP_1_1_所需的错误代码,客户端应使用HTTP/1.1重试


与Azure一样,也要这样做。

在builder中添加此行

.protocols(Util.immutableList(Protocol.HTTP_1_1))
像这样

 private OkHttpClient client = new OkHttpClient.Builder()
            .protocols(Util.immutableList(Protocol.HTTP_1_1))
            .build();

这很奇怪。因为当我使用边缘浏览器通过客户端证书连接到Azure端点时。它正确地返回了一个响应,我看到HTTP/2与网络监视器一起使用。。。这意味着它支持客户端证书。额外信息:客户端证书确实适用于服务器上的每个资源。不仅限于特定的端点。