Java 播放框架WS-url空间
我在play framework 2.3.3中使用包含空格的url调用WS.url()时遇到问题。所有其他字符都是自动编码的url,但不是空格。当我尝试将所有空格更改为“%20”时,由于“%”字符,WS会将其转换为“%2520”。使用空格,我得到了java.net.URISyntaxException:查询中的非法字符。我该怎么办 URL查询字符串的一部分:Java 播放框架WS-url空间,java,web-services,playframework,playframework-2.3,Java,Web Services,Playframework,Playframework 2.3,我在play framework 2.3.3中使用包含空格的url调用WS.url()时遇到问题。所有其他字符都是自动编码的url,但不是空格。当我尝试将所有空格更改为“%20”时,由于“%”字符,WS会将其转换为“%2520”。使用空格,我得到了java.net.URISyntaxException:查询中的非法字符。我该怎么办 URL查询字符串的一部分: &input=/mnt/mp3/music/folder/01 - 23.mp3 代码如下所示: Promise<Jso
&input=/mnt/mp3/music/folder/01 - 23.mp3
代码如下所示:
Promise<JsonNode> jsonPromise = WS.url(url).setAuth("", "cube", WSAuthScheme.BASIC).get().map(
new Function<WSResponse, JsonNode>() {
public JsonNode apply(WSResponse response) {
System.out.println(response.getBody());
JsonNode json = response.asJson();
return json;
}
}
);
Promise jsonPromise=WS.url(url.setAuth(“,“cube”,WSAuthScheme.BASIC).get().map(
新函数(){
公共JsonNode应用(WSResponse响应){
System.out.println(response.getBody());
JsonNode json=response.asJson();
返回json;
}
}
);
如果检查控制台,您会发现异常为:java.net.URISyntaxException:索引处路径中的非法字符…
这是因为PlayJavaAPI使用Java.net.URL
(如第47行所示)
您可以使用java.net.URLEncoder对URL进行编码
WS.url("http://" + java.net.URLEncoder.encode("google.com/test me", "UTF-8"))
更新
如果需要符合RFC 2396的方法,可以执行以下操作:
java.net.URI u = new java.net.URI(null, null, "http://google.com/test me",null);
System.out.println("encoded url " + u.toASCIIString());
您应该根据java.net.URL(Play!用于它的WS)的方式“构建”URL。url()遵循相同的逻辑
建议仅对表单数据使用URL编码器/解码器。
从JavaDoc:
注意,java.net.URI类确实执行其组件的转义
特定情况下的字段。管理
URL的编码和解码使用java.net.URI,并转换在这两个类之间使用toURI()和URI.tour() 也可以使用URLEncoder和URLEcoder类,但只能用于HTML 表单编码,与定义的编码方案不同 在RFC2396中。” 因此,解决方案是使用这个:
WS.url(baseURL).setQueryString(yourQueryString);
WS.url(baseURL).setQueryParameter(param, value);
其中:
baseURL
是您的方案+主机+路径等yourQueryString
是。。。好的,您的查询字符串,但是没有?
:input=/mnt/mp3/music/folder/01-23.mp3WS.url(baseURL).setQueryString(yourQueryString);
WS.url(baseURL).setQueryParameter(param, value);
其中:
param
是查询字符串中参数的名称value
是参数的值.setQueryParameter(…)
来链接这些参数。这意味着这种方法不能很好地适应复杂的多参数查询字符串
干杯 不建议使用URL编码器/解码器。来自JavaDocs:“也可以使用URLEncoder和URLDecoder类,但仅用于HTML表单编码,这与RFC2396中定义的编码方案不同。”小心。您提供的URI示例(null,null,“me”)适用于URI构造函数URI(String scheme,String ssp,String fragment)。这意味着生成的url看起来是这样的(请注意#)->#不是真的。尽管打印的结果是正确的,但构造函数的用法却不正确。您的案例的正确用法(仍然不是OPs问题的解决方案):URI(“http”、“google.com”、“/test me”、null);这很有效。我缺少setQueryString方法。谢谢