4

を使用して POST リクエストを実行しようとしていHttpsURLConnectionます。

java.net.ProtocolException: Connection already established

setRequestMethod奇妙なことに、直前にconn.connected戻ります。false

私は何が欠けていますか?

URL url = new URL("https://ws.audioscrobbler.com/2.0/");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
// here conn.connected is false
conn.setRequestMethod("POST"); // here I get java.net.ProtocolException: Connection already established
conn.setDoInput(true);

編集

私は DefaultHttpClient を試してみましたが、動作するので、代わりに使用します。

4

2 に答える 2

1

この問題に遭遇した他の人にとっては、リクエスト本文にコンテンツが含まれる HTTP POST を実行しているときにのみ影響を受ける、操作順序の問題がありました。HttpURLConnection が実際にサーバーへの接続を開始している場合、すべてのシナリオで完全に明確というわけではありません。

私の最初のリクエストは次のようになりました。

        HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

「conn.getOutputStream()」を呼び出した後は「conn.setRequestMethod(...)」を呼び出すことができないことが判明したため、私の場合、簡単な修正は「conn.setRequestMethod(...)」の呼び出しでした。 "リクエストボディへの書き込みを処理する前に。作業コードは次のとおりです。

HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

唯一の実際の変更は、呼び出しの順序を切り替えることであり、それによって例外が取り除かれました。うまくいけば、この問題を抱えていた他の人の問題が解決します。

于 2014-12-11T20:07:22.263 に答える
0

試しDefaultHttpClientてみたところうまくいきましたので、代わりに使用します。

于 2013-08-02T07:27:07.490 に答える