HttpsURLConnection 中的"Connection already established"例外



我正在尝试使用HttpsURLConnection进行POST请求,并获得

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,它有效,所以我将使用它。

对于遇到此问题的其他人,我遇到了一个操作顺序问题,该问题仅在我执行HTTP POST时才影响到我,该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(。工作代码为:

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();
            }

唯一真正的变化只是切换了呼叫的顺序,从而消除了异常。希望这能为其他有这个问题的人解决这个问题。

我尝试了DefaultHttpClient,它有效,所以我将使用它。

最新更新