commons httpclient - 将查询字符串参数添加到GET/POST请求

Oce*_*nic 70 java apache-httpclient-4.x

我正在使用公共HttpClient对Spring servlet进行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);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用servlet读取参数时

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getParameter("key");
Run Code Online (Sandbox Code Playgroud)

它返回null.实际上parameterMap是完全空的.当我在创建HttpGet请求之前手动将参数附加到url时,参数在servlet中可用.当我使用附加了queryString的URL从浏览器中访问servlet时也是如此.

这里的错误是什么?在httpclient 3.x中,GetMethod有一个setQueryString()方法来追加查询字符串.4.x中的等价物是什么?

Sub*_*emm 111

以下是使用HttpClient 4.2及更高版本添加查询字符串参数的方法:

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

HttpPost post = new HttpPost(builder.build());
Run Code Online (Sandbox Code Playgroud)

生成的URI看起来像:

http://example.com/?parts=all&action=finish
Run Code Online (Sandbox Code Playgroud)


lie*_*cno 29

如果要在创建请求后添加查询参数,请尝试将其转换HttpRequest为a HttpBaseRequest.然后,您可以更改已转换请求的URI:

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

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

((HttpRequestBase) someHttpGet).setURI(uri);
Run Code Online (Sandbox Code Playgroud)


ska*_*man 12

HttpParams接口不用于指定查询字符串参数,而是用于指定HttpClient对象的运行时行为.

如果要传递查询字符串参数,则需要自己在URL上组装它们,例如

new HttpGet(url + "key1=" + value1 + ...);
Run Code Online (Sandbox Code Playgroud)

请记住首先对值进行编码(使用URLEncoder).

  • 在创建请求对象之后,是否无法添加查询字符串参数?如果没有,是否有另一种标准方法将参数传递给servlet用于任何请求方法(GET/PUT/POST)? (3认同)

小智 5

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)