2017-01-25 8 views
1

У меня перед клиентом стоит проблема с Джерси, мне нужно передать какой-то фильтр даты в качестве параметра, он содержит «=>», а Джерси жалуется:Как заставить майку принять символ «>» в ​​параметре запроса

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 

если я построить URL с UriBuilder как таковой:

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

После еще расследования выяснилось, вопрос Джерси был из-за неправильного возврата схемы (потому что или параметр), в отношении веб-службы я, наконец, получил ее работу, заменив пространство «+» до кодирования и используя UriComponent.encode с UriComponent.Type.FRAG MENT по параметру, содержащему «>»:

 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);