Ограничения на атрибуты говорят Вам, где Вы можете и не можете использовать их: названия атрибута должны быть уникальными, их порядок не может быть значительным, и и имя и значение могут содержать только текст. Элементы, в отличие от этого, могут иметь групповые имена, иметь значительное упорядочивание и могли смешать содержание.
Атрибуты применимы в доменах, где они отображаются на структуры данных, которые следуют тем правилам: имена и значения свойств на объекте, столбцов подряд таблицы, записей в словаре. (Но не, если свойства не являются всеми типами значения или записями в словаре, не строки.)
Попробуйте установить это свойство, чтобы узнать, помогает ли оно,
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;
}
}
}
Можете ли вы убедиться, что соединение не закрывается, прежде чем закончить читаете ответ? Может быть, HttpClient сразу анализирует код ответа и сохраняет его для будущих запросов, однако HttpURLConnection может возвращать -1 после закрытия соединения?
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.