2016-02-26 8 views
2

Мы используем Jersey Client 2.21. Я замечаю, что когда мы помещаем фигурные скобки (ака фигурные скобки) в качестве значения параметра, тогда он не получает должным образом закодированный. Не только это, но и все внутри фигурных скобок не закодировано. Это неверно для обычных скобок или других небезопасных символов, с которыми я тестировал.Кодирование фигурных скобок в Джерси-клиенте 2

См. Пример ниже. В этом примере я вводим три параметра. Параметр управления с пробелами. Один с фигурными фигурными скобками и один с обычными скобками.

public static void testJerseyEncoding() { 
    Client client = ClientBuilder.newClient(); 
    String url = "http://foo.com/path"; 
    Map<String, String> map = new HashMap<>(); 
    map.put("paramWithCurly", " {with a space}"); 
    map.put("paramWithOutCurly", "with a space"); 
    map.put("paramWithBracket", "[with a space]"); 
    WebTarget target = client.target(url); 
    for (Map.Entry<String, String> entry : map.entrySet()) { 
     target = target.queryParam(entry.getKey(), entry.getValue()); 
    } 
    System.out.println(target.toString()); 
} 

Вот результат:

JerseyWebTarget { http://foo.com/path?paramWithBracket=%5Bwith+a+space%5D&paramWithOutCurly=with+a+space&paramWithCurly=+{with a space} } 

ли что-то порвал с клиентом Джерси или я что-то не хватает? Коричневые фигурные скобки должны быть закодированы до «% 7B».

ответ

0

Когда вы создаете параметр со значением в фигуре, Джерси считает, что вы хотите использовать параметр URL. См. https://jersey.java.net/documentation/latest/uris-and-links.html.

UriBuilder.fromUri("http://localhost/") 
.path("{a}") 
.queryParam("name", "{value}") 
.build("segment", "value"); 

Таким образом, вы должны кодировать фигурными скобками себя через URLEncoder, вероятно, как описано здесь: How to force URIBuilder.path(...) to encode parameters like "%AD"? This method doesn't always encode parameters with percentage, correctly.

+2

спасибо, что раскрыл тайну, почему он не закодировал фигурные скобки. любая идея, как отключить эту фигурную фигуру «особенность»? Похоже, что плохая идея для каркаса клиента jersey по-разному обрабатывает фигурные скобки, фигурные скобки кодируются и, следовательно, могут отображаться в URI. –

3

Вместо предварительного предварительного кодирования значения параметра запроса, лучший способ может быть выполнен всегда использовать параметр шаблона, а затем использовать resolveTemplate() с небезопасным значением.

Client client = ClientBuilder.newClient(); 

WebTarget target = client.target("http://server") 
      .path("/foo") 
      .queryParam("bar", "{bar}") 
      .resolveTemplate("bar", "{\"foo\":\"bar\"}"); 

assertThat(target.getUri().toString()) 
     .isEqualTo("http://server/foo?bar=%7B%22foo%22%3A%22bar%22%7D");