所以,我有一些看起来像这样的代码:
try {
URL url = new URL(url_raw);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
/*snip*/
connection.connect();
int response_code = connection.getResponseCode(); <-- Error here
/*snip*/
- 当 url 返回没有内容的 204 时,我会抛出异常。
- 当 url 返回 204 但仍然有内容时,我会抛出异常。
- 当 url 返回任何包含内容的非 204 代码时,我没问题。 (例如,带有“成功”消息的 200)。
错误日志在这里:
W/System.err﹕ javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5f5d07c0: Failure in SSL library, usually a protocol error
W/System.err﹕ error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x5d908d74:0x00000000)
W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449)
W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:107)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)
我可以通过从不返回 204 来解决这个问题,但这似乎太过分了 =/
最佳答案
W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449)
W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:107)
根据此跟踪,它在初始 TLS 握手中失败。 HTTPS 连接的 TLS 握手必须在发送 HTTP 请求和读取 HTTP 响应之前完成。由于它已经在 TLS 握手中失败,因此在收到状态代码之前,问题不可能与状态代码本身相关。
相反,您需要查看服务器端的实现错误,而不是客户端。我的猜测是服务器坏了,在 204 的情况下没有进行任何 TLS 握手,但鉴于没有提供有关此服务器的信息,这只是一个大胆的猜测。
关于android - 响应为 204(无内容)时的 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316803/