Java Play WS.get没有正确处理url?

时间:2015-07-22 09:14:52

标签: java playframework-2.3

在java Play(2.3.9)应用程序中尝试获取绝对正确的URL:

WS.url("http://foo.dfg?q=" + URLEncoder.encode("text with = sign", "utf-8")); 

得到这个: java.lang.RuntimeException:java.net.MalformedURLException:QueryString参数不应超过2 =每个部分

挖掘代码后发现,在NingWSRequestHolder内部有一段代码:

if (reference.getQuery() != null) {
   this.setQueryString(reference.getQuery()); //getQuery returns already decoded query
}

public WSRequestHolder setQueryString(String query) {
    String[] params = query.split("&");
    for (String param : params) {
        String[] keyValue = param.split("="); //param == "q=text with = sign" here
        if (keyValue.length > 2) {
            throw new RuntimeException(new MalformedURLException("QueryString parameter should not have more than 2 = per part"));
        } else if (keyValue.length >= 2) {
            this.setQueryParameter(keyValue[0], keyValue[1]);
        } else if (keyValue.length == 1 && param.charAt(0) != '=') {
            this.setQueryParameter(keyValue[0], null);
        } else {
            throw new RuntimeException(new MalformedURLException("QueryString part should not start with an = and not be empty"));
        }
    }
    return this;
}

不应该

String[] keyValue = param.split("=");

读:

String[] keyValue = param.split("=", 2);

我错过了什么或者它是一个错误?

1 个答案:

答案 0 :(得分:2)

修改

我知道如何构建正确的URL有两个选项:

WS.url("http://foo.dfg").setQueryString(yourQueryString);

WS.url("http://foo.dfg").
    setQueryParameter(param1, value1).
    setQueryParameter(param2, value2);

两次调用都得到相同的结果/异常吗?

另外,请注意注释here

  

也可以使用URLEncoder和URLDecoder类,但仅适用于HTML表单编码[...]

您的查询字符串为q=a=b=c=d - 这已超过两个=

page=2这样的查询字符串将返回长度为2的数组,因此将标记为正确

here可以看出,默认limit参数为零。零意味着将尽可能多地应用模式。这就是为什么你得到两个以上的分割部分。

提供查询字符串的正确方法如下:

param1=value1&param2=value2&param3=value3我相信你应该重新格式化你的字符串。请注意,在这种情况下,您有多个部分,但每个部分只包含一个键和值(因此只有一个=