¿Cómo agrego parámetros de consulta a un GetMethod (usando Java commons-httpclient)?

StackOverflow https://stackoverflow.com/questions/217070

  •  03-07-2019
  •  | 
  •  

Pregunta

Al utilizar el commons-httpclient de Apache 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:

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

GetMethod no tiene un " addParameter " método, 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 codifican los parámetros directamente en la URL, por ejemplo:

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

o codifique la cadena de consulta, por ejemplo:

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

¿Se prefiere uno de estos patrones? ¿Y por qué la discrepancia API entre PostMethod y GetMethod? ¿Y cuáles son todos los otros métodos de HttpMethodParams que deben usarse?

¿Fue útil?

Solución

Los métodos de publicación tienen parámetros de publicación, pero los métodos de obtención no .

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 la clave, el par de valores anterior, puede usar:

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

Puede encontrar un buen tutorial de inicio en página de Apache Jakarta Commons .

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

Otros consejos

No es solo una cuestión de preferencia personal. El problema pertinente aquí es la codificación de URL de sus valores de parámetros, para que los valores no se corrompan o se interpreten erróneamente como delimitadores adicionales, etc.

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

Al leer esto, puede ver que setQueryString (String) NO codificará en URL ni delimitará sus parámetros & amp; valores, mientras que setQueryString (NameValuePair []) automáticamente codificará en URL y delimitará sus nombres y valores de parámetros. Este es el mejor método siempre que esté utilizando datos dinámicos, ya que puede contener signos, signos de igualdad, etc.

Inténtalo 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());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top