2009-09-15 5 views
6

J'ai trouvé un problème. J'ai un serveur qui utilise l'en-tête de l'agent utilisateur pour identifier le périphérique qui s'y connecte. Mais quand je me connecte au serveur en utilisant HttpURLConnection je n'obtiens aucun en-tête d'agent d'utilisateur, mais quand je me connecte avec le navigateur il envoie l'agent d'utilisateur correct.HttpURLConnection dans android n'envoie pas l'en-tête User-Agent correct

Pour tester, j'utilise un serveur d'écho qui répond avec les en-têtes trouvés dans la requête. Quand je me connecte au navigateur, j'obtiens: Exemple: User-Agent: Mozilla/5.0 (Linux, U, Android 1.5, en-fr, HTC Hero Build/CUPCAKE) AppleWebKit/528.5 + (KHTML, comme Gecko) Version/3.1.2 Mobile Safari/525.20.1 Up.Link/6.3.1.20.06.3.1.20.0.

Mais quand je me connecte par code avec URLConnection i get:

User-Agent: INDISPONIBLE.

Est-ce que quelqu'un sait que j'ai des comportements différents? Comment puis-je me connecter de la même manière que le navigateur?

EDIT:

Ce que je vraiment besoin est non seulement l'en-tête User-Agent, j'ai besoin aussi des en-têtes spéciaux (x-up-subno en fait). Cet en-tête est ajouté par l'APN de l'opérateur, mais pour une raison quelconque, lorsque je me connecte par un code, les en-têtes ne sont pas ajoutés à la requête.

à partir du navigateur: browser http://bannergame.googlecode.com/files/device_browser.png

De code: code http://bannergame.googlecode.com/files/device_code.png

Merci,

+1

Je pense que vous trouverez que la plupart des bibliothèques de connexions HTTP n'envoient pas elles-mêmes un User-Agent, –

+1

Ce n'est vraiment pas une bonne idée de renifler User-Agent, il y a une variété de problèmes que vous rencontrerez avec des agents inconnus et couchés, bloquant le logiciel. Si vous trouvez un autre moyen de signaler que vous voulez une page spéciale orientée Android, faites-le .. – bobince

Répondre

10

Les HTTP specification stipule que tous les clients sont censés envoyés en-têtes User-Agent. Cependant, il n'indique pas qu'ils doivent identifier le client de la manière dont un serveur le souhaite. Android est donc conforme à la spécification, et il n'y a pas grand chose à faire à ce sujet. Le mieux que vous puissiez faire est d'utiliser la méthode setRequestProperty() pour essayer d'obtenir une valeur d'agent utilisateur préférable dans la requête. Il n'y a aucune garantie que cela fonctionnerait, mais c'est probable. La méthode doit être appelée de la manière suivante:

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

Le navigateur Android stock utilise WebKit. Si vous souhaitez définir la chaîne d'agent utilisateur de WebKit, vous devez utiliser une valeur statique ou lire la chaîne d'agent utilisateur à partir de WebKit. Je n'ai pas essayé cela, mais la chaîne d'utilisateur-agent WebKit est disponible dans Android via le getUserAgentString() method of the WebSettings class.

+0

Je sais à ce sujet, mais comment je peux utiliser le même type de chaîne de connexion que le navigateur en utilisant?Je ne veux pas déranger moi-même un agent utilisateur, je veux utiliser l'agent utilisateur de l'appareil. –

+0

J'ai mis à jour la réponse pour inclure une solution possible. –

+5

@answer: La spécification HTTP utilise le mot "should" et non "must". Cela indique que ce serait bien, mais vous n'êtes pas "supposé". @Lucas S: Pourquoi voudriez-vous vous identifier comme navigateur lorsque vous n'êtes PAS le navigateur? –

-2

c'est faux si HttpURLConnection a truqué l'agent utilisateur du navigateur. ce n'est pas le navigateur après tout. ce serait bien s'il envoyait un peu plus d'information, comme peut-être "Java/1.6 (MacOS 10.5 ..." etc.

+0

Quelle est la raison de répondre après 3 ans. –

+1

@JeffreyBlattman Ceci est un site de questions-réponses, pas un forum. Veuillez seulement poster une réponse si vous avez des informations utiles à ajouter. –

Questions connexes