如何强迫球衣接受'>'查询参数中的字符

时间:2017-01-25 22:17:41

标签: java encoding parameters jersey queryparam

我在客户端遇到Jersey问题,我必须传递一些日期过滤器作为参数,它包含“=>”和泽西抱怨:

Caused by: java.lang.IllegalArgumentException: Path segment is null
at com.sun.jersey.api.uri.UriBuilderImpl.appendPath(UriBuilderImpl.java:547)

查询本身如下:

CustomData dat = getWebResource()
            .path(path)
            .queryParam("display","full")
            .queryParam("date","1")
            .queryParam("filter[date_upd]",">[2016-01-08 10:32:00]")
            .queryParam("filter[valid]","1")
            .type(MediaType.APPLICATION_XML).get(CustomData.class);

经过一些尝试,我明白了'>'是问题的原因(日期中的空间被错误编码)。如果我删除它泽西岛是好的但网络服务不起作用。是否有一种特殊的方法来传递具有“=>”的参数而不是“=”? 当我在浏览器中直接尝试URL时,它可以工作:

http://www.xxxx.com/api/orders/?display=full&date=1&filter[date_upd]=>[2016-01-08%2010:32:00]&filter[valid]=1

如果我用UriBuilder构建url:

uri = UriBuilder.fromPath("http://www.xxxx.com/api/"+Order.URLORDER)
                .queryParam("display","full")
                .queryParam("date","1")
                .queryParam("filter[date_upd]",">[2016-01-08 10:32:00]")
                .queryParam("filter[valid]","1").build();            
System.out.println(uri.toASCIIString());
//http://www.xxxx.com/api/orders/?display=full&date=1&filter%5Bdate_upd%5D=%3E%5B2016-01-08+10:32:00%5D&filter%5Bvalid%5D=1

在浏览器中尝试它也可以,但是如果我在查询中使用URI,那么查询将再次失败。问题应该在其他地方。

URI uri = UriBuilder.fromPath("http://www.xxxx.com/api/"+Order.URLORDER)
                .queryParam("display","full")
                .queryParam("date","1")
                .queryParam("filter[date_upd]",">[2016-01-08 10:32:00]")
                .queryParam("filter[valid]","1").build();        
CustomData dat = getWebResource().uri(uri).type(MediaType.APPLICATION_XML).get(CustomData.class); 

有什么想法吗?

也尝试了

.queryParam("filter[date_upd]",URLEncoder.encode(">[2016-01-08 10:32:00]", "UTF-8"))

.queryParam("filter[date_upd]",URLEncoder.encode("%3E[2016-01-08 10:32:00]", "UTF-8"))

使用相同的“路径段为空”错误

1 个答案:

答案 0 :(得分:1)

经过更多的调查后发现泽西问题是由于错误的方案返回(因为或参数),关于webservice我终于通过在编码和使用UriComponent.encode之前用'+'替换空格来使其工作使用包含'>'的参数的UriComponent.Type.FRAGMENT:

        CustomData dat = getWebResource()
            .path(path)
            .queryParam("date","1")
            .queryParam("filter[date_upd]",UriComponent.encode(">[2016-01-08+10:32:00]", UriComponent.Type.FRAGMENT))
            .queryParam("filter[valid]","1")
            .type(MediaType.APPLICATION_XML)
            .get(CustomData.class);