java - new - httpclient comunes-Agregar parámetros de cadena de consulta a solicitud GET/POST
text field java (5)
Estoy usando commons HttpClient para hacer una llamada http a un servlet Spring. Necesito agregar algunos parámetros en la cadena de consulta. Entonces hago lo siguiente:
HttpRequestBase request = new HttpGet(url);
HttpParams params = new BasicHttpParams();
params.setParameter("key1", "value1");
params.setParameter("key2", "value2");
params.setParameter("key3", "value3");
request.setParams(params);
HttpClient httpClient = new DefaultHttpClient();
httpClient.execute(request);
Sin embargo, cuando intento leer el parámetro en el servlet usando
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getParameter("key");
devuelve nulo. De hecho, el parameterMap está completamente vacío. Cuando agrego manualmente los parámetros a la url antes de crear la solicitud HttpGet, los parámetros están disponibles en el servlet. Lo mismo cuando presiono el servlet desde el navegador usando la URL con queryString adjuntado.
¿Cuál es el error aquí? En httpclient 3.x, GetMethod tenía un método setQueryString () para anexar la cadena de consulta. ¿Cuál es el equivalente en 4.x?
A continuación, le mostramos cómo agregaría los parámetros de cadena de consulta utilizando HttpClient 4.2 y versiones posteriores:
URIBuilder builder = new URIBuilder("http://example.com/");
builder.setParameter("parts", "all").setParameter("action", "finish");
HttpPost post = new HttpPost(builder.build());
El URI resultante se vería así:
http://example.com/?parts=all&action=finish
Este enfoque está bien, pero no funcionará cuando obtenga parámetros de forma dinámica, a veces 1, 2, 3 o más, al igual que una consulta de búsqueda SOLR (por ejemplo)
Aquí hay una solución más flexible. Crudo pero puede ser refinado.
public static void main(String[] args) {
String host = "localhost";
String port = "9093";
String param = "/10-2014.01?description=cars&verbose=true&hl=true&hl.simple.pre=<b>&hl.simple.post=</b>";
String[] wholeString = param.split("//?");
String theQueryString = wholeString.length > 1 ? wholeString[1] : "";
String SolrUrl = "http://" + host + ":" + port + "/mypublish-services/carclassifications/" + "loc";
GetMethod method = new GetMethod(SolrUrl );
if (theQueryString.equalsIgnoreCase("")) {
method.setQueryString(new NameValuePair[]{
});
} else {
String[] paramKeyValuesArray = theQueryString.split("&");
List<String> list = Arrays.asList(paramKeyValuesArray);
List<NameValuePair> nvPairList = new ArrayList<NameValuePair>();
for (String s : list) {
String[] nvPair = s.split("=");
String theKey = nvPair[0];
String theValue = nvPair[1];
NameValuePair nameValuePair = new NameValuePair(theKey, theValue);
nvPairList.add(nameValuePair);
}
NameValuePair[] nvPairArray = new NameValuePair[nvPairList.size()];
nvPairList.toArray(nvPairArray);
method.setQueryString(nvPairArray); // Encoding is taken care of here by setQueryString
}
}
Estoy usando httpclient 4.4.
Para la consulta de solr utilicé de la siguiente manera y funcionó.
NameValuePair nv2 = new BasicNameValuePair("fq","(active:true) AND (category:Fruit OR category1:Vegetable)");
nvPairList.add(nv2);
NameValuePair nv3 = new BasicNameValuePair("wt","json");
nvPairList.add(nv3);
NameValuePair nv4 = new BasicNameValuePair("start","0");
nvPairList.add(nv4);
NameValuePair nv5 = new BasicNameValuePair("rows","10");
nvPairList.add(nv5);
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
URI uri = new URIBuilder(request.getURI()).addParameters(nvPairList).build();
request.setURI(uri);
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != 200) {
}
BufferedReader br = new BufferedReader(
new InputStreamReader((response.getEntity().getContent())));
String output;
System.out.println("Output .... ");
String respStr = "";
while ((output = br.readLine()) != null) {
respStr = respStr + output;
System.out.println(output);
}
La interfaz HttpParams
no está ahí para especificar los parámetros de cadena de consulta, es para especificar el comportamiento en tiempo de ejecución del objeto HttpClient
.
Si desea pasar parámetros de cadena de consulta, debe ensamblarlos en la URL usted mismo, por ejemplo
new HttpGet(url + "key1=" + value1 + ...);
Recuerde codificar los valores primero (usando URLEncoder
).
Si desea agregar un parámetro de consulta después de haber creado la solicitud, intente HttpBaseRequest
HttpRequest
en HttpBaseRequest
. Luego puede cambiar el URI de la solicitud emitida:
HttpGet someHttpGet = new HttpGet("http://google.de");
URI uri = new URIBuilder(someHttpGet.getURI()).addParameter("q",
"That was easy!").build();
((HttpRequestBase) someHttpGet).setURI(uri);