java.io.IOException: сервер возвращает код ответа HTTP 505
У меня есть HTML-запросы в моем коде, и один конкретный вид, кажется, вызывает IOExceptions
после получения 505 ответа от сервера. Я посмотрел ответ 505 вместе с другими людьми, у которых, похоже, были похожие проблемы. Очевидно, 505 означает несоответствие версии HTTP, но когда я копирую один и тот же URL-адрес запроса в любой браузер (пробовал firefox, seamonkey и Opera), кажется, нет проблем. В одном из прочитанных мной постов высказано предположение, что браузеры могут автоматически решать проблему несоответствия версий.
Я попытался углубиться, используя хороший инструмент разработчика, который поставляется с Opera, и похоже, что в версиях нет несоответствия (я считаю, что Java использует HTTP 1.1) и хороший 200 OK
ответ получен. Почему у меня возникают проблемы, когда тот же запрос проходит через мой Java-код?
private InputStream openURL(String urlName) throws IOException{
URL url = new URL(urlName);
URLConnection urlConnection = url.openConnection();
return urlConnection.getInputStream();
}
Пример ссылки: http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length
5 ответов
В Tomcat были некоторые проблемы с URL-адресами, содержащими пробел в нем. Чтобы решить проблему, вам нужно закодировать ваш URL с помощью URLEncoder
,
Пример (обратите внимание на пробел):
String url="http://example.org/test test2/index.html";
String encodedURL=java.net.URLEncoder.encode(url,"UTF-8");
System.out.println(encodedURL); //outputs http%3A%2F%2Fexample.org%2Ftest+test2%2Findex.html
Как разработчик на www.uniprot.org, я имею возможность просматривать журналы запросов. За последний год по логам мы не отправили 505 код ответа. В любом случае наши серверы понимают запросы http 1, а также http1.1 по умолчанию (хотя вы можете не получить ожидаемых результатов).
Это заставляет меня подозревать, что на пути было какое-то повреждение данных. Или вы были затронуты аппаратным сбоем (в последнее время у нас были некоторые проблемы с коммутатором и целым центром данных;). В любом случае, если у вас возникнут вопросы или проблемы с uniprot.org, пожалуйста, свяжитесь с help@uniprot.org, и мы посмотрим, сможем ли мы помочь / решить проблему.
Ваш фрагмент кода кажется нормальным и должен работать.
С уважением, Джервен Боллеман
Из документации API для класса URL:
Класс URL сам по себе не кодирует и не декодирует какие-либо компоненты URL [...]. Вызывающая сторона несет ответственность за кодирование любых полей, которые должны быть экранированы до вызова URL, а также за декодирование любых экранированных полей, которые возвращаются из URL.
так что если у вас есть пробелы в вашем url-str, закодируйте его перед вызовом нового URL (url-str)
Ты за прокси? Этот код работает для меня и печатает тот же текст, который я вижу через браузер.
final URL url = new URL("http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length");
final URLConnection conn = url.openConnection();
final InputStream is = conn.getInputStream();
System.out.println(IOUtils.toString(is));
conn
является экземпляром HttpURLConnection
@posdef У меня была та же проблема с кодом ошибки HTTP 505. Когда я вставил URL, который использовал в коде Java в Firefox, в Chrome это работало. Но через код давал IOException. Но в конце концов я узнал, что в строке url были скобки '(' и ')', удалив их, и это сработало, так что, похоже, мне нужно URLEncodeing так же, как в браузерах.