Проблема кодирования с фигурными скобками и пробелом в UriBuilder - PullRequest
0 голосов
/ 22 ноября 2018

Я использую com.sun.jersey.api.uri.UriBuilderImpl реализацию UriBuilder для кодирования URL (версия 1.19).Проблема возникает, когда параметр запроса моего URL-адреса включает в себя как фигурные скобки, так и пробел.

Пример:

UriBuilder uriBuilder = fromUri("www.something.com")
        .queryParam("q", "{some thing}");

return uriBuilder.build().toString();

Сбой:

javax.ws.rs.core.UriBuilderException: java.net.URISyntaxException: Illegal character in query at index 27: www.something.com?q=%7Bsome thing%7D

интересно, как будто я убираю фигурные скобки, получаю ожидаемую кодировку: www.something.com?q=some+thing ...

org.apache.http.client.utils.URIBuilder кодирует это, как я и ожидал, а именно: www.something.com?q=%7Bsome+thing%7D

Я пытался сделать это:

...
.queryParam("q", UriComponent.encode(searchQuery, UriComponent.Type.QUERY_PARAM)).
.build();

Но тогда символ пробела также кодируется в www.something.com?q=%7Bsome%2Bthing%7D.

Что мне нужно сделать, чтобы получить www.something.com?q=%7Bsome+thing%7D?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете попробовать это: Вам нужны две библиотеки jersey-core-1.19.2 и javax.ws.rs и jersey-client-1.19.2

public class ClassTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String queryString =  URLEncoder.encode("{some thing}", "UTF-8");
        System.out.println(queryString);
        URI uri = UriBuilder.fromUri("www.something.com")
                .queryParam("q", queryString)
                .build();
        String url = uri.toString().replace("%2B", "+");
        System.out.println(url);
    }
}
0 голосов
/ 22 ноября 2018

Я использую jersey-client v1.9.1, и ваш код выполняется без ошибок.

Вот моя зависимость maven:

<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.9.1</version>
        </dependency>

И код Java:

import java.net.URI;

import javax.ws.rs.core.UriBuilder;

public class Main {
    public static void main(String[] args) throws Exception {
        try {
            URI url = UriBuilder.fromUri("www.something.com")
                    .queryParam("q", "{some thing}")
                    .build();
            System.out.println(url);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Вывод: www.something.com?q=%7Bsome+thing%7D

ОБНОВЛЕНИЕ

Фигурные скобки являются причиной сбоя с v1.19 (см. документация )

Вот рабочая версия для v1.19:

        URI url = UriBuilder.fromPath("www.something.com")
                .queryParam("q", "{value}")
                .build("{some thing}", "value");
        System.out.println(url);
...