Как предотвратить фактическое подключение openConnection()

Я хочу использовать HttpURLConnection для подключения к моему веб-сервису, POST XML и получить результат. Я использую следующий код:

URL url = new URL(urlString);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");

Проблема в том, что когда я вызываю метод setRequestProperty, он завершается с ошибкой IllegalStateException, говорящей, что я "уже подключен". По-видимому, openConnection на самом деле открывает соединение с URL-адресом (в моем отладчике я вижу, что логическое значение connected равно true). Согласно URL документации Oracle не должен. В документации Android это неясно.

Как предотвратить подключение openConnection, чтобы я мог установить дополнительные свойства?

Обновить. Похоже, что connection находится в каком-то пуле и не отключается, даже после вызова connection.disconnect() или даже после отключения сервера.

Я не думаю, что это дубликат этого вопроса так как он не дает реального ответа. Кроме того, документация кажется неясной.


person Bart Friederichs    schedule 23.06.2015    source источник
comment
возможный дубликат метода setResponseCode, дающего java.lang.IllegalStateException: невозможно установить метод после подключения и некоторые другие...   -  person Selvin    schedule 23.06.2015
comment
@ Селвин, да. Этому более трех лет, и на него нет принятого ответа. И ответы, которые у него есть, не исправить.   -  person Bart Friederichs    schedule 23.06.2015
comment
тогда вы должны добавить награду ... не повторять вопрос ... вы хотите новее? здесь   -  person Selvin    schedule 23.06.2015
comment
@Selvin, тот старше   -  person Bart Friederichs    schedule 23.06.2015
comment
хе-хе, хорошо :) просто используйте setRequestProperty(connection, close) (и, возможно, keep-alive false) в предыдущем использовании любого соединения в вашем приложении   -  person Selvin    schedule 23.06.2015
comment
@Selvin Я бы с удовольствием, но свойства больше нельзя установить ...   -  person Bart Friederichs    schedule 23.06.2015
comment
так это первое подключение в приложении?   -  person Selvin    schedule 23.06.2015
comment
Правильно установитьRequestProperty() после openConnection(). Однако перед настройкой каких-либо метаданных обязательно установите нужный метод HTTP-запроса. В вашем случае: connection.setRequestMethod(HttpConnection.POST);   -  person Andrei Mărcuţ    schedule 23.06.2015
comment
@Маркус, setDoOutput позаботится об этом   -  person Bart Friederichs    schedule 23.06.2015
comment
а версия API устройства ....   -  person Selvin    schedule 23.06.2015


Ответы (1)


openConnection() не подключается, и код, который вы разместили, ведет себя не так, как вы описали. Что открывает TCP-соединение, так это любое из следующего:

  • getInputStream()
  • getErrorStream()
  • getResponseCode()

Следовательно, вы должны были вызвать один из них, прежде чем пытаться установить свойство запроса.

person user207421    schedule 23.06.2015
comment
Возможно ли, что соединение находится в каком-то пуле? Я вызвал один из этих методов, но у последующих подключений возникла проблема. У меня есть finally { connection.disconnect(); } на месте. - person Bart Friederichs; 23.06.2015
comment
Предположим, вы публикуете настоящий код, чтобы мы все знали, о чем вы говорите. - person user207421; 23.06.2015
comment
Вы также должны вызвать connection.close(), чтобы фактически освободить соединение. - person Andrei Mărcuţ; 23.06.2015
comment
@Маркус connection.close() не существует - person Bart Friederichs; 23.06.2015
comment
Я думал, что это классический HttpConnection. Можете ли вы поделиться фактическим рабочим процессом? Например. подключить - writeXml - readResponse - закрыть входной поток - закрыть выходной поток - отключить - повторить - person Andrei Mărcuţ; 23.06.2015
comment
@downvoter Не обманывай себя. Прочтите исходный код. Я сделал. - person user207421; 16.02.2018