2008-10-19 15 views
32

Al usar los recursos comunes de http: httpclient para Java, ¿cuál es la mejor manera de agregar parámetros de consulta a una instancia de GetMethod? Si estoy usando PostMethod, es muy sencillo:¿Cómo agrego los parámetros de consulta a GetMethod (usando Java commons-httpclient)?

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

GetMethod no tiene un método "addParameter", sin embargo. He descubierto que esto funciona:

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

Sin embargo, la mayoría de los ejemplos que he visto, ya sea difícil que el código de los parámetros directamente en la URL, por ejemplo:

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

o codificar la cadena de consulta, p. ej .:

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

¿Es preferible uno de estos patrones? ¿Y por qué la discrepancia API entre PostMethod y GetMethod? ¿Y para qué sirven todos esos otros métodos de HttpMethodParams?

Respuesta

22

Los métodos de publicación tienen parámetros de publicación, pero get methods do not.

Los parámetros de consulta están incrustados en la URL. La versión actual de HttpClient acepta una cadena en el constructor. Si desea agregar el par de claves, el valor anterior, se puede utilizar:

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

Un buen tutorial de partida se puede conocer en la Apache Jakarta Commons page.

actualización: Como se sugiere en el comentario, NameValuePair funciona.

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

he descubierto que esto funciona: método GetMethod = new GetMethod ("http://www.example.com/page"); method.setQueryString (new NameValuePair [] { nuevo NameValuePair ("clave", "valor") }); Esto no se menciona en la página del tutorial, sin embargo. ¿Debería evitarse este patrón? – Ross

+0

Hm, aparentemente no puedes poner bloques de código en los comentarios, así que he editado mi pregunta para agregar ese ejemplo y otros. – Ross

17

No es solo una cuestión de preferencia personal. La cuestión pertinente aquí es el URL que codifica los valores de los parámetros, por lo que los valores no se corrompe o mal interpretada como delimitadores adicionales, etc.

Como siempre, lo mejor es leer la documentación de la API en detalle: HttpClient API Documentation

la lectura de este, se puede ver que setQueryString(String) no va a cifrar la URL de o delimitar sus parámetros & valores, mientras que setQueryString(NameValuePair[]) automáticamente cifrar la URL de y delimitar sus nombres y valores de los parámetros. Este es el mejor método cuando está utilizando datos dinámicos, ya que podría contener los símbolos de unión, la igualdad de signos, etc.

8

Trate de esta manera:

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

en qué paquete está UrlBuilder? –

+0

Creo que debería ser: "GetMethod (builder.build())" –

+0

URIBuilder se puede encontrar en: org.apache.http.client.utils.URIBuilder; – AtliB

Cuestiones relacionadas