Définition de l’agent utilisateur d’une URLConnection Java

J’essaie d’parsingr une page Web en utilisant Java avec URLConnection. J’essaie de configurer l’agent utilisateur comme ceci:

java.net.URLConnection c = url.openConnection(); c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 

Mais l’agent utilisateur résultant est celui que je spécifie, avec “Java / 1.5.0_19” ajouté à la fin. Existe-t-il un moyen de définir réellement l’agent utilisateur sans cet ajout?

En d’autres http.agent , la définition de la propriété système http.agent sur "" peut faire l’affaire (je n’ai pas le code devant moi).

Vous pourriez vous en tirer avec:

  System.setProperty("http.agent", ""); 

mais cela peut nécessiter une course entre vous et l’initialisation du gestionnaire de protocole d’URL, s’il met en cache la valeur au démarrage (en fait, je ne le pense pas).

La propriété peut également être définie via des fichiers JNLP (disponibles pour les applets de 6u10) et sur la ligne de commande:

 -Dhttp.agent= 

Ou pour les commandes wrapper:

 -J-Dhttp.agent= 

Juste pour clarification: setRequestProperty fonctionne très bien! Au moins avec Java 1.6.30.

J’ai écouté sur ma machine avec netcat (un auditeur de port):

 $ nc -l -p 8080 

Il écoute simplement sur le port, de sorte que vous voyez tout ce qui est demandé, comme les en-têtes http bruts.

Et obtenu les en-têtes http suivants sans setRequestProperty:

 GET /foobar HTTP/1.1 User-Agent: Java/1.6.0_30 Host: localhost:8080 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive 

Et avec setRequestProperty:

 GET /foobar HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 Host: localhost:8080 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive 

Comme vous pouvez le voir, l’agent utilisateur a été correctement défini.

Exemple complet:

 import java.io.IOException; import java.net.URL; import java.net.URLConnection; public class TestUrlOpener { public static void main(Ssortingng[] args) throws IOException { URL url = new URL("http://localhost:8080/foobar"); URLConnection hc = url.openConnection(); hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); System.out.println(hc.getContentType()); } } 

Tom Hawtins a légèrement changé sa réponse à:

  System.setProperty("http.agent", ""); 

selon http://www.ivoa.net/forum/apps/0903/0610.htm

son travail pour moi définit l’agent utilisateur dans la propriété addRequest.

 URL url = new URL(); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"); 

Les serveurs HTTP ont tendance à rejeter les anciens navigateurs et systèmes.

La page Tech Blog (wh): Most User User Agents reflète la propriété user-agent de votre navigateur actuel dans la section “Votre agent utilisateur est:” , qui peut être appliquée pour définir la propriété de requête “User-Agent” d’un java.net.URLConnection ou la propriété système “http.agent”.