java.io.IOException: сервер возвращает HTTP-код ответа 505 - PullRequest
18 голосов
/ 02 сентября 2010

В моем коде есть запросы на основе 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 ]

40 голосов
/ 15 ноября 2010

В 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
8 голосов
/ 03 сентября 2010

Как разработчик на www.uniprot.org У меня есть преимущество в том, что я могу просматривать журналы запросов. За последний год по логам мы не отправили 505 код ответа. В любом случае наши серверы понимают запросы http 1, а также http1.1 по умолчанию (хотя вы можете не получить ожидаемых результатов).

Это заставляет меня подозревать, что на пути было какое-то повреждение данных. Или вы были затронуты аппаратным сбоем (в последнее время у нас были некоторые проблемы с коммутатором и целым центром данных;). В любом случае, если у вас возникнут вопросы или проблемы с uniprot.org, пожалуйста, свяжитесь с help@uniprot.org, и мы посмотрим, сможем ли мы помочь / решить проблему.

Ваш фрагмент кода выглядит нормально и должен работать.

С уважением, Джервен Боллман

3 голосов
/ 04 октября 2011

из документации API для URL класса:

Класс URL не кодирует и не декодирует какие-либо компоненты URL. [...]. Ответственность за кодирование любых полей лежит на вызывающем абоненте. которые необходимо экранировать до вызова URL, а также декодировать любой экранированные поля, возвращаемые из URL.

так что если у вас есть пробелы в вашем url-str, закодируйте его перед вызовом нового URL (url-str)

2 голосов
/ 11 января 2013

@ posdef У меня была та же проблема с кодом ошибки HTTP 505. Когда я вставил URL, который использовал в коде Java в Firefox, в Chrome это работало. Но через код давал IOException. Но в конце концов я узнал, что в строке url есть скобки '(' и ')', удалив их, и это сработало, так что, похоже, мне нужно URLEncodeing так же, как браузеры.

2 голосов
/ 02 сентября 2010

Вы за прокси?Этот код работает для меня и печатает тот же текст, который я вижу в браузере.

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

...