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

Ответы

Ответ 1

В 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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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