Java, HttpURLConnection и настройка длины контента - PullRequest
13 голосов
/ 15 августа 2011

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

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 15 августа 2011

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

2 голосов
/ 15 августа 2011

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

0 голосов
/ 27 августа 2018

Я получаю ту же ошибку с «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
...