URL закодировать часть строки в Java - PullRequest
0 голосов
/ 04 марта 2019

У меня есть URL, в котором у меня есть несколько макросов, которые я не хочу кодировать, но оставшаяся часть должна быть.Например -

https://example.net/adaf/${ABC}/asd/${WSC}/ 

должно быть закодировано как

https%3A%2F%2Fexample.net%2Fadaf%2F${ABC}%2Fasd%2F${WSC}%2F

URLEncoder.encode(string, encoding) кодирует всю строку.Мне нужна функция вида - encode(string, start, end, encoding)

Есть ли какая-либо библиотека, которая делает это?

1 Ответ

0 голосов
/ 04 марта 2019

AFAIK, ни одна стандартная библиотека не предоставляет такой перегруженный метод.Но вы можете построить собственную функцию-оболочку на основе стандартного API.

Для достижения своей цели код может выглядеть следующим образом:

public static void main(String[] args) throws UnsupportedEncodingException {
    String source = "https://example.net/adaf/${ABC}/asd/${WSC}/";
    String target = "https%3A%2F%2Fexample.net%2Fadaf%2F${ABC}%2Fasd%2F${WSC}%2F";

    String encodedUrl = encode(source, 0, 25, StandardCharsets.UTF_8.name()) +
            source.substring(25, 31) +
            encode(source, 31, 36, StandardCharsets.UTF_8.name()) +
            source.substring(36, 42) +
            encode(source, 42, 43, StandardCharsets.UTF_8.name());


    System.out.println(encodedUrl);
    System.out.println(encodedUrl.equals(target));
}

static String encode(String s, int start, int end, String encoding) throws UnsupportedEncodingException {
    return URLEncoder.encode(s.substring(start, end), StandardCharsets.UTF_8.name());
}

https%3A%2F%2Fexample.net%2Fadaf%2F${ABC}%2Fasd%2F${WSC}%2F

true

Но это будет довольно грязно.

В качестве альтернативы вы можете просто заменить кодировки, которые вы не хотите экранировать, на их первоначальное значение после кодирования:

public static void main(String[] args) throws UnsupportedEncodingException {
    String source = "https://example.net/adaf/${ABC}/asd/${WSC}/";
    String target = "https%3A%2F%2Fexample.net%2Fadaf%2F${ABC}%2Fasd%2F${WSC}%2F";

    String encodedUrl = URLEncoder.encode(source, StandardCharsets.UTF_8.name())
            .replaceAll("%24", "\\$")
            .replaceAll("%7B", "{")
            .replaceAll("%7D", "}");


    System.out.println(encodedUrl);
    System.out.println(encodedUrl.equals(target));
}

https%3A%2F%2Fexample.net%2Fadaf%2F${ABC}%2Fasd%2F${WSC}%2F

true

...