Java 播放 WS.get 没有正确处理 url?
Java Play WS.get does not process url properly?
在 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);
我是不是遗漏了什么或者这是一个错误?
编辑:
我知道如何构建一个合适的 URL:
的两个选项
WS.url("http://foo.dfg").setQueryString(yourQueryString);
和
WS.url("http://foo.dfg").
setQueryParameter(param1, value1).
setQueryParameter(param2, value2);
两次调用都得到相同的 result/exception 吗?
此外,请记住注释 here:
The URLEncoder and URLDecoder classes can also be used, but only for HTML form encoding [...]
您的查询字符串是 q=a=b=c=d
- 这已经有两个以上 =
.
像 page=2
这样的查询字符串会 return 一个长度为 2 的数组,因此将被标记为 正确。
正如您从 here 中看到的,默认的 limit
参数为零。零意味着该模式将被应用尽可能多的次数。这就是为什么您会得到两个以上的拆分部分。
提供查询字符串的正确方法是这样的:
param1=value1¶m2=value2¶m3=value3
我相信这就是您应该重新格式化字符串的方式。请注意,在这种情况下,您有多个部分,但每个部分仅包含一个键和值(因此中间只有一个 =
)
在 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);
我是不是遗漏了什么或者这是一个错误?
编辑:
我知道如何构建一个合适的 URL:
的两个选项WS.url("http://foo.dfg").setQueryString(yourQueryString);
和
WS.url("http://foo.dfg").
setQueryParameter(param1, value1).
setQueryParameter(param2, value2);
两次调用都得到相同的 result/exception 吗?
此外,请记住注释 here:
The URLEncoder and URLDecoder classes can also be used, but only for HTML form encoding [...]
您的查询字符串是 q=a=b=c=d
- 这已经有两个以上 =
.
像 page=2
这样的查询字符串会 return 一个长度为 2 的数组,因此将被标记为 正确。
正如您从 here 中看到的,默认的 limit
参数为零。零意味着该模式将被应用尽可能多的次数。这就是为什么您会得到两个以上的拆分部分。
提供查询字符串的正确方法是这样的:
param1=value1¶m2=value2¶m3=value3
我相信这就是您应该重新格式化字符串的方式。请注意,在这种情况下,您有多个部分,但每个部分仅包含一个键和值(因此中间只有一个 =
)