Java, HttpURLConnection и настройка длины контента

Я устанавливаю длину содержимого в своем HttpURLConnection для PUT.

urlConnection.setRequestProperty("Content-Length", "" + responseJSONArray.toString(2).getBytes("UTF8").length);

Фактическое количество байтов равно 74. Однако, когда я запрашиваю длину содержимого urlConnection, мне возвращается -1. Это почему? И почему длины не равны (учитывая, что я установил это)?

Я должен установить длину содержимого, потому что я получаю ответ 411 от сервера.

(Кроме того, в Sun примеры я видел, что второй аргумент setRequestProperty имеет тип int и не String, что кажется странным.)


person SK9    schedule 15.08.2011    source источник
comment
Я ответил на этот вопрос, и теперь я понимаю, что у него есть тег Android. Я понятия не имею, как Google реализовал HttpURLConnection.   -  person Buhake Sindi    schedule 15.08.2011
comment
@The Elite Gentleman, им пришлось бы согласиться с существующей спецификацией Javadoc, и ваши недоразумения не имели ничего общего с возможными различиями между реализациями.   -  person user207421    schedule 22.08.2011


Ответы (3)


Вы не должны устанавливать этот заголовок самостоятельно. Используйте setFixedLengthStreamingMode() или setChunkedTransferMode().

person user207421    schedule 15.08.2011
comment
Спасибо. Я до сих пор чего-то не понимаю: я сейчас делаю urlConnection.setFixedLengthStreamingMode(responseJSONArray.toString(2).getBytes("UTF8").length);. Длина тела составляет 74 байта, однако, когда я вызываю Log.v("app", "" + urlConnection.getContentLength());, я вижу -1. Это почему? - person SK9; 15.08.2011
comment
@SK9 это длина ответа. - person user207421; 15.08.2011
comment
Спасибо. Мне это кажется излишне двусмысленным! - person SK9; 15.08.2011
comment
@ SK9 в этом нет ничего двусмысленного. В Javadoc нет ссылки на длину содержимого запроса. Все дело в ответе. - person user207421; 16.08.2011
comment
@ SK9, конечно, но вы спросили о getContentLength(),, о чем я и ответил. - person user207421; 18.08.2011
comment
Я установил setFixedLengthStreamingMode(), но getContentLength() по-прежнему возвращает -1 на сервере-клиенте. Есть кто решает эту проблему? - person boiledwater; 12.04.2012
comment
@boiledwater Вы установили его до того, как начали писать вывод? - person user207421; 13.04.2012
comment
@кипяток Почему? Это говорит именно то, что я сказал вам здесь. - person user207421; 19.04.2012

Также не забудьте добавить setDoOutput, чтобы сообщить вашему соединению, что вы собираетесь отправлять данные.

person Nicolas Modrzyk    schedule 15.08.2011
comment
Спасибо. Я уже (с urlConnection.setDoOutput(true);). - person SK9; 15.08.2011
comment
По праву должно быть -1, так как вы отправляете данные, а не получаете их с сервера. getContentLenght(): возвращает длину содержимого в байтах, указанную длиной содержимого поля заголовка ответа, или -1, если это поле не установлено. Из Android Javadoc для HttpURLConnection - person Nicolas Modrzyk; 15.08.2011
comment
Хм, я думал, что поле длины содержимого указывает длину HTTP-запроса в байтах, который я готовил. - person SK9; 15.08.2011
comment
Что должно быть -1? Вопрос касается длины запроса. Ваша цитата касается длины ответа. Ваше замечание не имеет смысла. - person user207421; 22.10.2016

Я получаю ту же ошибку с "Content-Length" -

        URL url = new URL(targetURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "text/plain");
        connection.setRequestProperty("Authorization", authKey);
        connection.setRequestProperty("Content-Length", Integer.toString(requestJSON.getBytes().length));

И я, наконец, пришел к выводу, что это происходит потому, что одно из полей объекта Json содержит диакритические символы.

        someCategory = "Ţepuşă";
        try {
        JSONObject postData = new JSONObject();
        postData.put("category", someCategory);
        .....

Вот как выглядит ошибка:

08-27 18:57:07.842 24263-24263/ro.nexuserp.documentecontabile E/Eror: content-length promised 491001 bytes, but received 491000
person Adrian S.    schedule 27.08.2018
comment
Ошибка в том, что вы вообще не должны его устанавливать. Java установит его за вас. Это было заявлено несколько раз, за ​​восемь лет до того, как вы написали. - person user207421; 23.09.2019