[英]Play framework WS url spaces
我在播放框架2.3.3中使用包含空格的url调用WS.url()时遇到问题。 所有其他字符都自动编码,但不是空格。 当我尝试将所有空格更改为“%20”时,由于“%”字符,WS将其转换为“%2520”。 使用空格我有java.net.URISyntaxException:查询中的非法字符。 我怎么处理这个?
URL的一部分查询字符串:
&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;
}
}
);
您应该根据java.net.URL(Play!用于它的WS)的方式“构建”您的URL。 WS.url()遵循相同的逻辑。
建议仅对表单数据使用URLEncoder / Decoder。 来自JavaDoc:
“注意,java.net.URI类在某些情况下会执行其组件字段的转义。管理URL编码和解码的推荐方法是使用java.net.URI,并进行转换
使用toURI()和URI.toURL()在这两个类之间。 也可以使用URLEncoder和URLDecoder类,但仅用于HTML表单编码,这与RFC2396中定义的编码方案不同。“
所以,解决方案是使用这个 :
WS.url(baseURL).setQueryString(yourQueryString);
哪里:
baseURL
是你的方案+主机+路径等。 yourQueryString
是......好吧,你的查询字符串,但没有 ?
:input = / mnt / mp3 / music / folder / 01 - 23.mp3 或者,如果你想使用更灵活,编程方法, 这 :
WS.url(baseURL).setQueryParameter(param, value);
哪里:
param
是查询String中的参数名称 value
是参数的值 如果您想在查询中使用带有值的多个参数,则需要通过添加另一个.setQueryParameter(...)
来链接它们。 这意味着这种方法不适合复杂的多参数查询字符串。
干杯!
如果你检查控制台,你会发现异常是: java.net.URISyntaxException: Illegal character in path at index ...
这是因为可以玩Java API使用java.net.URL
(你可以看到在这里的第47行)。
您可以使用java.net.URLEncoder对您的URL进行编码
WS.url("http://" + java.net.URLEncoder.encode("google.com/test me", "UTF-8"))
UPDATE
如果您需要符合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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.