2010-11-23 2 views
0

Вот мой код:400 ошибка HttpClient для связи с якорем

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url); 
HttpResponse response = client.execute(request); 

Это работает для каждого URL я пытался до сих пор для некоторых URLs, которые содержат якорь, за исключением. Некоторые из этих привязанных URL возвращают 400. Странно, что это не все ссылки, содержащие якорь, многие из них работают нормально.

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

Ссылки полностью действительны и отлично работают в любом браузере, но HttpClient возвращает 400 при попытке ссылки. Если я удалю якорь, он будет работать.

Любые идеи, что искать?

Например: http://www.somedomain.com/somedirectory/somepage#someanchor

К сожалению снова дженериков

EDIT: Я должен упомянуть, что это для Android.

ответ

3

Как говорит @Greg Sansom, URL-адрес не должен отправляться с якорем/фрагментом. Часть фрагмента URL-адреса не относится к серверу.

Вот ожидаемый синтаксис URL из relevant part в HTTP 1.1 спецификации:

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Примечания: нет fragment части в синтаксисе.

Что происходит, если вы действительно отправляете fragment, очевидно, это специфическая реализация сервера. Я ожидаю, что вы увидите множество ответов:

  • Некоторые серверы будут тихо лишать/игнорировать фрагмент. (Это то, что вы ожидаете).
  • Некоторые серверы могут рассматривать это как ошибку запроса и отвечать на запрос 400.
  • Некоторые серверы могут ошибочно обрабатывать фрагмент как часть пути или запроса и давать вам 404 или какой-либо другой ответ в зависимости от того, как " запутанный "фрагмент делает сервер.
  • Некоторые серверы могут фактически наполнить фрагмент определенным значением. (Это кажется мне глупым, что нужно сделать, но вы никогда не знаете ...)

ИМО, самое разумное решение, чтобы лишить его от URL до того экземпляра HttpGet объекта.

Followup

Рекомендуемый способ удаления фрагмента из строки URL, чтобы превратить его в экземпляр java.net.URL или java.net.URI, извлечь соответствующие компоненты, использовать их для создания нового java.net.URL или java.net.URI экземпляра (выезд из фрагмента, конечно), и, наконец, верните его в строку.

Но я думаю, что также должно работать следующее: если вы можете с уверенностью предположить, что ваши URL-адреса являются действительными абсолютными URL-адресами HTTP или HTTPS.

int pos = url.indexOf("#"); 
    String strippedUrl = (pos >= 0) ? url.substring(0, pos) : url; 
5

Неправильное использование анкера в URL-адресе. Когда мы выполняем «Получить», нам нужно получить весь ресурс (страница). Якорь - это всего лишь тег, обозначающий местоположение, обычно ваш браузер будет прокручиваться до положения якоря после загрузки страницы. Не имеет смысла «Получить» страницу на определенном якоре - вся страница должна быть выбрана.

Возможно, ваши непоследовательные результаты связаны с тем, что некоторые веб-серверы игнорируют якорный компонент, а другие исправляют вашу ошибку.

Решение только для удаления части #anchor URL-адреса перед запуском вашего кода.

+0

Это точно верно; привязка не является допустимой частью URL для отправки на веб-сервер. – 2010-11-23 01:49:15

+0

Я просто пытался оставить URL-адрес, как есть, но это имеет смысл, поскольку он не будет использоваться в любом случае. Спасибо – cottonBallPaws 2010-11-23 01:55:04

0

Строка user_url2 = "uhttp: //www.somedomain.com/somedirectory/somepage#someanchor";

HttpClient client = new DefaultHttpClient(); 
    HttpGet siteRequest = new HttpGet(user_url2); 
    StringBuilder sb = new StringBuilder(); 

    HttpResponse httpResponse; 

    try { 
     httpResponse = client.execute(siteRequest); 
     HttpEntity entity = httpResponse.getEntity(); 
     InputStream in = entity.getContent(); 

     String line = null; 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(in)); 
     while ((line = reader.readLine()) != null) 

     { 

      sb.append(line); 

     } 

     result = sb.toString(); 

строка результата будет Отображаемый URL значение