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 так же, как в браузерах.

Другие вопросы по тегам