2008-10-19 14 views
32

En utilisant le client http d'Apache pour Java, quel est le meilleur moyen d'ajouter des paramètres de requête à une instance de GetMethod? Si j'utilise PostMethod, il est très simple:Comment ajouter des paramètres de requête à un GetMethod (en utilisant Java commons-httpclient)?

PostMethod method = new PostMethod(); 
method.addParameter("key", "value"); 

GetMethod ne possède pas de méthode « addParameter », cependant. Je l'ai découvert que cela fonctionne:

GetMethod method = new GetMethod("http://www.example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 

Cependant, la plupart des exemples que je l'ai vu soit coder en dur les paramètres directement dans l'URL, par exemple:

GetMethod method = new GetMethod("http://www.example.com/page?key=value"); 

ou coder en dur chaîne de requête, par exemple:

GetMethod method = new GetMethod("http://www.example.com/page"); 
method.setQueryString("?key=value"); 

L'un de ces modèles est-il préférable? Et pourquoi la différence API entre PostMethod et GetMethod? Et à quoi servent toutes ces autres méthodes HttpMethodParams?

Répondre

22

Les méthodes de publication ont des paramètres de publication, mais get methods do not.

Les paramètres de requête sont incorporés dans l'URL. La version actuelle de HttpClient accepte une chaîne dans le constructeur. Si vous vouliez ajouter la clé, paire de valeurs ci-dessus, vous pouvez utiliser:

String url = "http://www.example.com/page?key=value"; 
GetMethod method = new GetMethod(url); 

Un bon tutoriel de départ se trouvent sur le Apache Jakarta Commons page.

Mise à jour: Comme suggéré dans le commentaire, NameValuePair fonctionne.

GetMethod method = new GetMethod("example.com/page"); 
method.setQueryString(new NameValuePair[] { 
    new NameValuePair("key", "value") 
}); 
+6

J'ai découvert que cela fonctionne: méthode GetMethod = new GetMethod ("http://www.example.com/page"); method.setQueryString (nouveau NameValuePair [] { nouveau NameValuePair ("clé", "valeur") }); Ceci n'est cependant pas mentionné sur la page du tutoriel. Ce modèle devrait-il être évité? – Ross

+0

Hm, apparemment, vous ne pouvez pas mettre des blocs de code dans les commentaires, alors j'ai modifié ma question pour ajouter cet exemple et d'autres. – Ross

17

Ce n'est pas seulement une question de préférence personnelle. La question pertinente est ici codant URL vos valeurs de paramètres, de sorte que les valeurs ne seront pas corrompues ou mal interprétées comme délimiteurs supplémentaires, etc.

Comme toujours, il est préférable de lire la documentation API en détail: HttpClient API Documentation

lecture, vous pouvez voir que setQueryString(String) sera pas encodée pour les URL ou délimiter vos paramètres & valeurs, alors que setQueryString(NameValuePair[]) seront URL encode automatiquement et délimiter vos noms et valeurs de paramètres. Ceci est la meilleure méthode chaque fois que vous utilisez des données dynamiques, car il peut contenir des esperluette, le signe égal, etc.

8

Essayez cette façon:

URIBuilder builder = new URIBuilder("https://graph.facebook.com/oauth/access_token") 
      .addParameter("client_id", application.getKey()) 
      .addParameter("client_secret", application.getSecret()) 
      .addParameter("redirect_uri", callbackURL) 
      .addParameter("code", code); 

    HttpPost method = new HttpPost(builder.build()); 
+6

dans quel paquet se trouve UrlBuilder? –

+0

Je pense qu'il devrait être: "GetMethod (builder.build())" –

+0

URIBuilder peut être trouvé à: org.apache.http.client.utils.URIBuilder; – AtliB