web-dev-qa-db-fra.com

Comment ajouter des paramètres de requête à une GetMethod (en utilisant Java commons-httpclient)?

En utilisant commons-httpclient d'Apache pour Java, quelle est la meilleure façon d'ajouter des paramètres de requête à une instance GetMethod? Si j'utilise PostMethod, c'est très simple:

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

GetMethod n'a cependant pas de méthode "addParameter". J'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 j'ai vus 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 codez en dur la chaîne de requête, par exemple:

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

Faut-il privilégier l'un de ces modèles? Et pourquoi l'écart d'API entre PostMethod et GetMethod? Et à quoi servent toutes ces autres méthodes HttpMethodParams?

32
Ross

Les méthodes de publication ont des paramètres de publication, mais les méthodes get ne le font pas .

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

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

Un bon tutoriel de démarrage peut être trouvé sur la page Apache Jakarta Commons .

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") 
}); 
22
Ryan Guest

Ce n'est pas seulement une question de préférence personnelle. Le problème pertinent ici est le codage d'URL des valeurs de vos paramètres, afin que les valeurs ne soient pas corrompues ou mal interprétées comme délimiteurs supplémentaires, etc.

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

En lisant ceci, vous pouvez voir que setQueryString(String) ne codera pas URL ou ne délimitera pas vos paramètres et valeurs, tandis que setQueryString(NameValuePair[]) codera automatiquement URL et délimitera vos noms et valeurs de paramètres. C'est la meilleure méthode chaque fois que vous utilisez des données dynamiques, car elles peuvent contenir des esperluettes, des signes égaux, etc.

17
Steve Jones

Essayez-le de 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());
8
Randal Harleigh