HttpClient表单URL包含没有值的参数

时间:2011-11-09 14:11:59

标签: java web-services httpclient

需要传递get参数而不使用值而不使用“=”符号来使用外部API。网址是

http://example.com/Service/v1/service.ashx?methodName&name=val&blablabla

正如您所看到的,第一个参数是要在服务器上调用的方法(methodName)的名称,它没有任何值,也没有“=”。 我想以“正确”的方式形成参数,但目前形成如下:

    List<NameValuePair> params = new LinkedList<NameValuePair>();
    params.add(new BasicNameValuePair("name", "val"));
    params.add(new BasicNameValuePair("name1", "val1"));

    String paramString = URLEncodedUtils.format(params, "utf-8");

    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(getEndpointUrl() + "?methodName&" + paramString);

问题出在使用串联的最后一行(而不是常规的params转换)。将“methodName”作为名称添加到params并将null作为值添加到结果URL中的“methodName =”。服务器不理解这种表示法。

3 个答案:

答案 0 :(得分:5)

我认为你最好手动形成网址。我们广泛使用HttpGet方法,当我们构造URL字符串时,我们手动确保参数'正确性'。然后,我们使用HttpClient项目中的URIUtil来编码查询字符串:

// Start with your base method name, if necessary/known
String paramString = "methodName";
for (NameValuePair p : params ) {
    String n = p.getName();
    String v = p.getValue();
    if ( v == null ) {
        paramString += "&" + n;
    } else {
        paramString += "&" + n + "=" + v;
    }
}

String url = "http://example.com/Service/v1/service.ashx?" + URIUtil.encodeQuery(paramString);
HttpGet get = new HttpGet(url);

答案 1 :(得分:1)

最好查看HttpClient源代码。从第一眼看,您需要继承HttpGet并覆盖getRequestLine方法以返回RequestLine接口的实现,该接口将以适当的方式格式化URL。

答案 2 :(得分:0)

您可以输入虚假值,而不是在服务器上检查它。

params.add(new BasicNameValuePair("methodName", "unused"));