6

一部のユーザーは、接続しようとしているときにこの例外を頻繁に受け取ります。

java.io.IOException: Unexpected response code for CONNECT: 400
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeTunnel(HttpsURLConnectionImpl.java:509)
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:463)
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:442)
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
    at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)

400 は不正なリクエストを意味しますが、数秒後に同じリクエストが成功します。リクエストを再確認しましたが、問題はありません。サーバーログも確認しましたが、リクエストがサーバーに届いていないようです。

シンプルHttpUrlConnectionに接続して使用しています。

URL connectURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
conn.setReadTimeout(30000); 
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Accept-Encoding", "deflate, gzip");
connection.setRequestProperty("Content-Length", postParameters.length() + "");

conn.connect();

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(mRequestObj.getPostParameters());
writer.flush();
writer.close();

responseCode = conn.getResponseCode();

BufferedInputStream bis = null;
try {
    bis = new BufferedInputStream(conn.getInputStream());
}
catch(IOException io) {
    if(conn.getErrorStream() != null) 
        bis = new BufferedInputStream(conn.getErrorStream());
    else 
        throw io;
}

... 

他の誰かがこの問題に直面しましたか? 何か役立つことはありますか?

4

1 に答える 1

1

これは古い質問ですが、誰かが役立つと思うかもしれません。

プロキシ トンネリングが何らかの理由で失敗したため、例外がスローされました。そのため、Web サーバーには何も表示されず、まったく到達していませんでした。


次の説明は、CONNECT メソッド タイプを参照しています。

この仕様では、動的にトンネルに切り替えることができるプロキシで使用するためにメソッド名 CONNECT を予約しています。

HTTP 仕様からコピーされました。


残念ながら、プロキシ サーバーを制御できない限り、多くのことを行うことはできません。できることは、例外をキャッチして接続を再試行することです。

于 2014-08-13T18:24:57.380 に答える