2009-09-15 13 views
6

Znalazłem problem. Mam serwer, który używa nagłówka User Agent, aby zidentyfikować urządzenie, które się z nim łączy. Ale kiedy łączę się z serwerem za pomocą HttpURLConnection, nie otrzymuję nagłówka User Agent, ale po połączeniu się z przeglądarką wysyła on prawidłowego agenta użytkownika.HttpURLConnection w Androidzie nie wysyła prawidłowego nagłówka User-Agent

Do testowania używam serwera echo, który odpowiada z nagłówkami znalezionymi na żądanie.

Po połączeniu się z przeglądarką uzyskuję: np .: User-Agent: Mozilla/5.0 (Linux; U; Android 1.5; en-fr; HTC Hero Build/CUPCAKE) AppleWebKit/528.5 + (KHTML, podobnie jak Gecko) Wersja/3.1.2 Mobile Safari/525.20.1 Up.Link/6.3.1.20.06.3.1.20.0.

Ale kiedy ja łączyć z kodem URLConnection uzyskać:

User-Agent: niedostępny.

Czy ktoś wie, że dostaję różne zachowania? Jak mogę połączyć się w taki sam sposób, jak przeglądarka?

EDIT:

co naprawdę potrzebne jest nie tylko nagłówek User-Agent, ja też potrzebuję jakieś specjalne nagłówki (x-up-subno faktycznie). Ten nagłówek jest dodawany przez APN operatora, ale z jakiegoś powodu, gdy łączę się przez kod, nagłówki nie są dodawane do żądania.

Od przeglądarce: browser http://bannergame.googlecode.com/files/device_browser.png

Od kodu: code http://bannergame.googlecode.com/files/device_code.png

Dzięki

+1

Myślę, że większość bibliotek połączeń HTTP nie wysyła samych użytkowników, ale dostarczają sposobów dodawania nagłówków do żądania, aby można było dodać własne znaczące. –

+1

To naprawdę nie jest dobry pomysł, aby wąchać User-Agent, istnieje wiele problemów, z którymi zmierzysz się z nieznanymi i kłamliwymi agentami, blokowanie oprogramowania , proxy i pamięci podręczne. Jeśli znajdziesz inny sposób sygnalizowania, że ​​chcesz mieć specjalną stronę z systemem Android, zrób to. – bobince

Odpowiedz

10

W HTTP specification stwierdza, że ​​wszyscy klienci są rzekomo wysyłanych nagłówków User-Agent. Nie oznacza to jednak, że powinni identyfikować klienta w taki sposób, jak chce tego serwer. Android jest zgodny ze specyfikacją i niewiele można z tym zrobić.

Najlepsze, co można zrobić, to użyć metody setRequestProperty(), aby spróbować uzyskać preferowaną wartość dla klienta użytkownika w żądaniu. Nie ma żadnych gwarancji, że to zadziała, ale jest prawdopodobne. Metoda musi zostać wywołana w następujący sposób:

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

Internetowa przeglądarka używa WebKit. Jeśli chcesz ustawić ciąg użytkownika WebKit, musisz albo użyć wartości statycznej, albo przeczytać ciąg agenta użytkownika z WebKit. Nie próbowałem tego, ale ciąg WebKit użytkownika agenta jest dostępny w systemie Android za pośrednictwem getUserAgentString() method of the WebSettings class.

+0

Wiem o tym, ale w jaki sposób mogę użyć tego samego typu ciąg połączenia, który przeglądarka jest za pomocą?Nie chcę samodzielnie przypisywać agenta użytkownika, chcę użyć urządzenia użytkownika. –

+0

Zaktualizowałem odpowiedź, aby uwzględnić możliwe rozwiązanie. –

+5

@answer: Specyfikacja HTTP używa słowa "powinien", a nie "musi". Oznacza to, że byłoby miło, ale nie "przypuszczasz". @Lucas S: Dlaczego chcesz identyfikować się jako przeglądarka, gdy NIE JESTEŚ przeglądarką? –

-2

To źle, jeśli HttpURLConnection sfałszował klienta użytkownika przeglądarki. w końcu to nie przeglądarka. Byłoby miło, gdyby wysłał trochę więcej informacji, np. "Java/1.6 (MacOS 10.5 ..." itd.

+0

Jaki jest powód odpowiadania po 3 latach. –

+1

@JeffreyBlattman To jest strona z pytaniami i odpowiedziami, a nie forum. Opublikuj odpowiedź tylko wtedy, gdy masz pomocne informacje do dodania. –

Powiązane problemy