2009-09-15 2 views
6

Я нашел проблему. У меня есть сервер, который использует заголовок User Agent для идентификации устройства, которое подключается к нему. Но когда я подключаюсь к серверу с помощью HttpURLConnection, я не получаю заголовка User Agent, но когда я подключаюсь к браузеру, он отправляет правильный User Agent.HttpURLConnection в android не отправляет правильный заголовок User-Agent

Для тестирования я использую сервер эха, который отвечает заголовками, найденными в запросе.

Когда я подключаюсь к браузеру, я получаю: например: User-Agent: Mozilla/5.0 (Linux; U; Android 1.5; en-fr; HTC Hero Build/CUPCAKE) AppleWebKit/528.5 + (KHTML, как и Gecko) Версия/3.1.2 Mobile Safari/525.20.1 Up.Link/6.3.1.20.06.3.1.20.0.

Но когда я соединяю с помощью кода с URLConnection я получаю:

User-Agent: UNAVAILABLE.

Кто-нибудь знает, что мы получаем разные формы поведения? Как я могу подключиться так же, как браузер?

EDIT:

Что я на самом деле нужно не только заголовок User-Agent, я также нужны специальные заголовки (х-до-subno на самом деле). Этот заголовок добавляется APN оператора, но по какой-то причине, когда я соединяюсь по коду, заголовки не добавляются в запрос.

Из браузера: browser http://bannergame.googlecode.com/files/device_browser.png

Из кода: code http://bannergame.googlecode.com/files/device_code.png

Спасибо,

+1

Я думаю, вы найдете, что большинство библиотек HTTP-соединений не отправляют сам User-Agent, но предоставляют способы добавления заголовков в запрос, чтобы вы могли добавить свой собственный значащий. –

+1

На самом деле не рекомендуется обманывать User-Agent, есть множество проблем, с которыми вы столкнетесь с неизвестными и лживыми агентами, блокируя программное обеспечение , прокси и кеши. Если вы можете найти какой-либо другой способ, чтобы сигнализировать, что вы хотите специальную страницу, ориентированную на Android, сделайте это. – bobince

ответ

10

В HTTP specification говорится, что все клиенты, как предполагается, посланных заголовки User-Agent. Однако он не указывает, что они должны идентифицировать клиента так, как этого хочет сервер. Таким образом, Android соответствует спецификации, и вы не можете много сделать.

Лучшее, что вы можете сделать, это использовать метод setRequestProperty(), чтобы попытаться получить предпочтительное значение пользовательского агента в запросе. Нет никаких гарантий, что это сработает, но это вполне вероятно. Этот метод должен быть вызван следующим образом:

connection.setRequestProperty("User-Agent","MyAppName/1.0"); 

В наличии Android-браузер использует WebKit. Если вы хотите установить строку user-agent WebKit, вам придется либо использовать статическое значение, либо прочитать строку user-agent из WebKit. Я не пытался это сделать, но строка user-agent WebKit доступна на Android через getUserAgentString() method of the WebSettings class.

+0

Я знаю об этом, но как я могу использовать тот же тип строки подключения, что браузер с помощью?Я не хочу самостоятельно вводить в действие пользовательский агент, я хочу использовать пользовательский агент устройства. –

+0

Я обновил ответ, чтобы включить возможное решение. –

+5

@answer: Спецификация HTTP использует слово «should» not «must». Это указывает на то, что было бы неплохо, но вы не «предположили». @ Lucas S: Почему вы хотите идентифицировать себя как браузер, когда вы НЕ являетесь браузером? –

-2

Неверно, если HttpURLConnection подделал пользовательский агент браузера. в конце концов, это не браузер. было бы неплохо, если бы он отправил немного больше информации, например, «Java/1.6 (MacOS 10.5 ...» и т. д.

+0

В чем причина ответа через 3 года. –

+1

@JeffreyBlattman Это сайт вопросов и ответов, а не форум. Пожалуйста, отправьте ответ, если у вас есть полезная информация для добавления. –