Исключение «Соединение уже установлено» в HttpsURLConnection

Я пытаюсь выполнить запрос 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, и он работает, поэтому я буду использовать его вместо этого.

Я попробовал DefaultHttpClient и он работает, поэтому я буду использовать его вместо этого.

Для любого другого, кто сталкивается с этой проблемой, у меня был порядок операций, который затронул меня только тогда, когда я выполнял 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 (eg 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; } на  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 (eg 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.setRequestMethod (…)» после того, как вы вызвали «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 (eg 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(); } на 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 (eg 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(); } 

Единственным реальным изменением было просто переключение заказов на звонки и избавление от исключения. Надеюсь, это решит проблему для всех, у кого возникла эта проблема.