HttpURLConnection в Android не отправляет правильный заголовок User-Agent - PullRequest
6 голосов
/ 16 сентября 2009

Я нашел проблему. У меня есть сервер, который использует заголовок User Agent для определения устройства, которое подключается к нему. Но когда я подключаюсь к серверу, используя HttpURLConnection, я не получаю заголовок User Agent, но когда я соединяюсь с браузером, он отправляет правильный 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. Ссылка / 6.3.1.20.06.3.1.20.0.

Но когда я соединяюсь по коду с UrlConnection, я получаю:

User-Agent: НЕДОСТУПЕН.

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

EDIT:

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

Из браузера: browser

из кода: code

Спасибо

Ответы [ 2 ]

10 голосов
/ 16 сентября 2009

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

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

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

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

0 голосов
/ 23 октября 2009

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

...