web-dev-qa-db-ja.com

commons httpclient-GET / POSTリクエストへのクエリ文字列パラメーターの追加

Commons HttpClientを使用して、Springサーブレットへのhttp呼び出しを行っています。クエリ文字列にいくつかのパラメーターを追加する必要があります。だから私は次のことをします:

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

しかし、私が使用してサーブレットのパラメータを読み取ろうとすると

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

nullを返します。実際、parameterMapは完全に空です。 HttpGet要求を作成する前に手動でパラメーターをURLに追加すると、サーブレットでパラメーターを使用できます。 queryStringを追加したURLを使用して、ブラウザーからサーブレットをヒットしたときも同じです。

ここのエラーは何ですか? httpclient 3.xでは、GetMethodにクエリ文字列を追加するsetQueryString()メソッドがありました。 4.xで同等のものは何ですか?

66
Oceanic

HttpClient 4.2以降を使用してクエリ文字列パラメーターを追加する方法は次のとおりです。

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

HttpPost post = new HttpPost(builder.build());

結果のURIは次のようになります。

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

リクエストを作成した後にクエリパラメータを追加する場合は、HttpRequestHttpBaseRequestにキャストしてみてください。次に、キャストされたリクエストのURIを変更できます。

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

HttpParamsインターフェイスは、クエリ文字列パラメーターを指定するためのものではなく、HttpClientオブジェクトの実行時の動作を指定するためのものです。

クエリ文字列パラメーターを渡す場合は、自分でURLで組み立てる必要があります。

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

最初に値をエンコードすることを忘れないでください(URLEncoderを使用)。

12
skaffman

Httpclient 4.4を使用しています。

Solrクエリでは、次の方法を使用し、機能しました。

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

このアプローチは問題ありませんが、SOLR検索クエリのように、動的にparamsを取得する場合、時には1、2、3、またはそれ以上では機能しません(たとえば)

より柔軟なソリューションを次に示します。原油ですが、精製することができます。

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