Java 播放框架WS-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

我在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<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.mp3
  • 或者,如果您想使用更灵活、程序化的方法,请执行以下操作:

    WS.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方法。谢谢