commons httpclient – Ajout de parameters de chaîne de requête à une requête GET / POST

J’utilise commons HttpClient pour faire un appel http à un servlet Spring. J’ai besoin d’append quelques parameters dans la chaîne de requête. Donc je fais ce qui suit:

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

Cependant, quand j’essaie de lire le paramètre dans le servlet en utilisant

 ((ServletRequestAtsortingbutes) RequestContextHolder.currentRequestAtsortingbutes()).getRequest().getParameter("key"); 

il retourne null. En fait, le paramètreMap est complètement vide. Lorsque j’ajoute manuellement les parameters à l’URL avant de créer la requête HttpGet, les parameters sont disponibles dans le servlet. Même si je frappe le servlet depuis le navigateur en utilisant l’URL avec querySsortingng ajouté.

Quelle est l’erreur ici? Dans httpclient 3.x, GetMethod avait une méthode setQuerySsortingng () pour append la chaîne de requête. Quel est l’équivalent en 4.x?

Voici comment append des parameters de chaîne de requête à l’aide de HttpClient 4.2 et versions ultérieures:

 URIBuilder builder = new URIBuilder("http://example.com/"); builder.setParameter("parts", "all").setParameter("action", "finish"); HttpPost post = new HttpPost(builder.build()); 

L’URI résultant devrait ressembler à:

 http://example.com/?parts=all&action=finish 

Si vous souhaitez append un paramètre de requête après avoir créé la demande, essayez de HttpBaseRequest le HttpRequest en HttpBaseRequest . Ensuite, vous pouvez modifier l’URI de la requête convertie:

 HttpGet someHttpGet = new HttpGet("http://google.de"); URI uri = new URIBuilder(someHttpGet.getURI()).addParameter("q", "That was easy!").build(); ((HttpRequestBase) someHttpGet).setURI(uri); 

L’interface HttpParams n’est pas là pour spécifier des parameters de chaîne de requête, c’est pour spécifier le comportement d’exécution de l’object HttpClient .

Si vous voulez passer des parameters de chaîne de requête, vous devez les assembler vous-même sur l’URL, par exemple

 new HttpGet(url + "key1=" + value1 + ...); 

N’oubliez pas de coder les valeurs en premier (en utilisant URLEncoder ).

J’utilise httpclient 4.4.

Pour la requête solr, j’ai utilisé la méthode suivante et cela a fonctionné.

 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()))); Ssortingng output; System.out.println("Output .... "); Ssortingng respStr = ""; while ((output = br.readLine()) != null) { respStr = respStr + output; System.out.println(output); } 

Cette approche est correcte mais ne fonctionnera pas lorsque vous obtenez des parameters dynamicment, parfois 1, 2, 3 ou plus, comme une requête de recherche SOLR (par exemple)

Voici une solution plus flexible. Brut mais peut être raffiné.

 public static void main(Ssortingng[] args) { Ssortingng host = "localhost"; Ssortingng port = "9093"; Ssortingng param = "/10-2014.01?description=cars&verbose=true&hl=true&hl.simple.pre=&hl.simple.post="; Ssortingng[] wholeSsortingng = param.split("\\?"); Ssortingng theQuerySsortingng = wholeSsortingng.length > 1 ? wholeSsortingng[1] : ""; Ssortingng SolrUrl = "http://" + host + ":" + port + "/mypublish-services/carclassifications/" + "loc"; GetMethod method = new GetMethod(SolrUrl ); if (theQuerySsortingng.equalsIgnoreCase("")) { method.setQuerySsortingng(new NameValuePair[]{ }); } else { Ssortingng[] paramKeyValuesArray = theQuerySsortingng.split("&"); List list = Arrays.asList(paramKeyValuesArray); List nvPairList = new ArrayList(); for (Ssortingng s : list) { Ssortingng[] nvPair = s.split("="); Ssortingng theKey = nvPair[0]; Ssortingng theValue = nvPair[1]; NameValuePair nameValuePair = new NameValuePair(theKey, theValue); nvPairList.add(nameValuePair); } NameValuePair[] nvPairArray = new NameValuePair[nvPairList.size()]; nvPairList.toArray(nvPairArray); method.setQuerySsortingng(nvPairArray); // Encoding is taken care of here by setQuerySsortingng } }