【问题标题】:Play framework WS url spaces播放框架 WS url 空间
【发布时间】:2014-08-16 12:59:26
【问题描述】:

我在播放框架 2.3.3 中调用 WS.url() 时遇到问题,其中 url 包含空格。所有其他字符都是自动编码的 url,但不是空格。当我尝试将所有空格更改为“%20”时,由于“%”字符,WS 将其转换为“%2520”。有空格我有 java.net.URISyntaxException: Illegal character in query。我该如何处理?

部分 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 web-services playframework playframework-2.3


    【解决方案1】:

    您应该根据 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 中。”

    所以,解决方案是使用THIS

    WS.url(baseURL).setQueryString(yourQueryString);
    

    地点:

    1. baseURL 是您的方案 + 主机 + 路径等。
    2. yourQueryString 是...好吧,您的查询字符串,但没有?:input=/mnt/mp3/music/folder/01 - 23.mp3

    或者,如果您想使用更灵活的程序化方法,这个

    WS.url(baseURL).setQueryParameter(param, value);
    

    地点:

    1. param是查询字符串中的参数名称
    2. value是参数的值

    如果您希望查询中有多个带有值的参数,您需要通过添加另一个 .setQueryParameter(...) 来链接它们。这意味着这种方法不太适合复杂的多参数查询字符串。


    干杯!

    【讨论】:

    • 效果很好。我错过了 setQueryString 方法。谢谢!
    【解决方案2】:

    如果你检查控制台你会发现异常是:java.net.URISyntaxException: Illegal character in path at index ...

    那是因为 play Java api 使用了java.net.URL(你可以在第 47 行看到here)。

    您可以使用 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()); 
    

    【讨论】:

    • 不推荐使用 URLEncoder/Decoder。来自 JavaDocs:“也可以使用 URLEncoder 和 URLDecoder 类,但仅用于 HTML 表单编码,这与 RFC2396 中定义的编码方案不同。”
    • 小心。您使用 URI(null,null,"google.com/testme") 提供的示例适用于 URI 构造函数 URI(String scheme, String ssp, String fragment)。这意味着生成的 url 看起来像这样(注意 #)-> #google.com/test%20me
    • 并非如此。尽管打印结果没问题,但构造函数的使用却不行。正确使用您的案例(仍然不是 OPs 问题的解决方案):URI("http", "google.com", "/test me",null);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多