web-dev-qa-db-fra.com

commons httpclient - Ajout de paramètres de chaîne de requête à la requête GET / POST

J'utilise commons HttpClient pour passer un appel http à un servlet Spring. J'ai besoin d'ajouter quelques paramètres dans la chaîne de requête. Alors 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

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getParameter("key");

il retourne null. En fait, le paramètre map est complètement vide. Lorsque j'ajoute manuellement les paramètres à l'URL avant de créer la demande HttpGet, les paramètres sont disponibles dans le servlet. Même chose quand je frappe le servlet à partir du navigateur en utilisant l'URL avec queryString ajouté.

Quelle est l'erreur ici? Dans httpclient 3.x, GetMethod disposait d'une méthode setQueryString () pour ajouter la chaîne de requête. Quel est l'équivalent en 4.x?

66
Oceanic

Voici comment ajouter des paramètres 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 ressemblerait à ceci:

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

Si vous souhaitez ajouter un paramètre de requête après avoir créé la demande, essayez de convertir le HttpRequest en un HttpBaseRequest. Ensuite, vous pouvez changer l'URI de la requête exprimée:

HttpGet someHttpGet = new HttpGet("http://google.de");

URI uri = new URIBuilder(someHttpGet.getURI()).addParameter("q",
        "That was easy!").build();

((HttpRequestBase) someHttpGet).setURI(uri);
27
liecno

L'interface HttpParams n'est pas là pour spécifier les paramètres de chaîne de requête, mais pour spécifier le comportement d'exécution de l'objet HttpClient.

Si vous souhaitez transmettre des paramètres de chaîne de requête, vous devez les assembler vous-même sur l'URL, par exemple.

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

Rappelez-vous d’encoder d’abord les valeurs (en utilisant URLEncoder).

12
skaffman

J'utilise httpclient 4.4.

Pour la requête solr j'ai utilisé la manière 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())));

String output;
System.out.println("Output  .... ");
String respStr = "";
while ((output = br.readLine()) != null) {
    respStr = respStr + output;
    System.out.println(output);
}
5
Jegatheesan

Cette approche est acceptable mais ne fonctionnera pas si vous obtenez des paramètres de manière dynamique, parfois 1, 2, 3 ou plus, comme pour une requête de recherche SOLR (par exemple).

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

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

    }
}
1
Rahul Saini