HttpURLConnection.getResponseCode () возвращается-1 на втором вызове

Ограничения на атрибуты говорят Вам, где Вы можете и не можете использовать их: названия атрибута должны быть уникальными, их порядок не может быть значительным, и и имя и значение могут содержать только текст. Элементы, в отличие от этого, могут иметь групповые имена, иметь значительное упорядочивание и могли смешать содержание.

Атрибуты применимы в доменах, где они отображаются на структуры данных, которые следуют тем правилам: имена и значения свойств на объекте, столбцов подряд таблицы, записей в словаре. (Но не, если свойства не являются всеми типами значения или записями в словаре, не строки.)

29
задан emmby 17 September 2009 в 19:48
поделиться

3 ответа

Попробуйте установить это свойство, чтобы узнать, помогает ли оно,

http.keepAlive=false

Я видел аналогичные проблемы, когда ответ сервера не понимается UrlConnection и клиент / сервер не синхронизируется.

Если это решает проблему ваша проблема, вы должны получить HTTP-трассировку, чтобы точно увидеть, что особенного в ответе.

РЕДАКТИРОВАТЬ: Это изменение только подтверждает мои подозрения. Это не решает твоей проблемы. Он просто скрывает симптом.

Если ответ на первый запрос - 200, нам нужна трассировка. Обычно я использую Ethereal / Wireshark для получения трассировки TCP.

Если ваш первый ответ не 200, я действительно вижу проблему в вашем коде. При использовании OAuth ответ об ошибке (401) фактически возвращает данные, которые включают ProblemAdvice, Signature Base String и т. Д., Чтобы помочь вам отладить. Вам нужно прочитать все из потока ошибок. В противном случае это запутает следующее соединение и это ' s причина -1. В следующем примере показано, как правильно обрабатывать ошибки:

public static String get(String url) throws IOException {

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    URLConnection conn=null;
    byte[] buf = new byte[4096];

    try {
        URL a = new URL(url);
        conn = a.openConnection();
        InputStream is = conn.getInputStream();
        int ret = 0;
        while ((ret = is.read(buf)) > 0) {
            os.write(buf, 0, ret);
        }
        // close the inputstream
        is.close();
        return new String(os.toByteArray());
    } catch (IOException e) {
        try {
            int respCode = ((HttpURLConnection)conn).getResponseCode();
            InputStream es = ((HttpURLConnection)conn).getErrorStream();
            int ret = 0;
            // read the response body
            while ((ret = es.read(buf)) > 0) {
                os.write(buf, 0, ret);
            }
            // close the errorstream
            es.close();
            return "Error response " + respCode + ": " + 
               new String(os.toByteArray());
        } catch(IOException ex) {
            throw ex;
        }
    }
}
28
ответ дан 28 November 2019 в 01:43
поделиться

Можете ли вы убедиться, что соединение не закрывается, прежде чем закончить читаете ответ? Может быть, HttpClient сразу анализирует код ответа и сохраняет его для будущих запросов, однако HttpURLConnection может возвращать -1 после закрытия соединения?

0
ответ дан 28 November 2019 в 01:43
поделиться

I've encountered the same problem when I did not read in all the data from the InputStream before closing it and opening a second connection. It was also fixed either with System.setProperty("http.keepAlive", "false"); or simply just looping until I've read the rest of the InputStream.

Not completely related to your issue, but hope this helps anyone else with a similar problem.

10
ответ дан 28 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: