8

Java: Кодирование параметров строки запроса в URL

1

У меня есть URL:

http://example.com/query?q=

и запрос, введённый пользователем, например:

random word £500 bank $

Я хочу получить правильно закодированный URL:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

Как лучше всего этого добиться? Я пробовал использовать URLEncoder и создание объектов URI/URL, но ни один из этих способов не даёт ожидаемого результата.

4 ответ(ов)

0

Вы можете использовать следующий метод в вашем коде для преобразования строки URL и карты параметров в корректную закодированную строку URL с включенными параметрами запроса.

String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
    if (parameters == null) {
        return url;
    }

    for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {

        final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
        final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");

        if (!url.contains("?")) {
            url += "?" + encodedKey + "=" + encodedValue;
        } else {
            url += "&" + encodedKey + "=" + encodedValue;
        }
    }

    return url;
}

Этот метод принимает строку URL и карту параметров, затем обрабатывает каждый параметр, кодируя его имя и значение с помощью URLEncoder. Если в URL еще нет параметров запроса, он добавляет ?, в противном случае добавляет & перед всеми новыми параметрами. Не забудьте обработать UnsupportedEncodingException, так как кодирование может вызвать это исключение.

0

В Android вы можете использовать следующий код для создания URI с параметрами запроса:

Uri myUri = Uri.parse("http://example.com/query").buildUpon().appendQueryParameter("q", "случайное слово A3500 банк 24").build();

Здесь объект Uri представляет собой android.net.Uri. При помощи метода buildUpon() вы можете модифицировать базовый URI, а метод appendQueryParameter() позволяет добавлять параметры запроса. В данном случае мы добавили параметр q с значением "случайное слово A3500 банк 24".

0

Чтобы закодировать строку запроса в Java, вы можете использовать один из следующих способов:

  1. Используйте этот код:

    URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());
    

    или этот:

    URLEncoder.encode(query, "UTF-8");
    
  2. Вы можете использовать следующий код:

    String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8"); // Без изменений
    String encodedUrl2 = URLEncoder.encode(query, "UTF-8"); // Изменено
    String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName()); // Изменено
    
    System.out.println("url1: " + encodedUrl1 + "\n" + "url2: " + encodedUrl2 + "\n" + "url3: " + encodedUrl3);
    

Этот код показывает различные подходы к кодированию строки запроса. Первый пример с UriUtils не вносит никаких изменений, тогда как использование URLEncoder приводит к изменению строки.

0

Вы можете использовать библиотеку commons-httpclient для кодирования параметров запроса в URL. Вот как это можно сделать:

Зависимость для Maven:

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
    <scope>test</scope>
</dependency>

Код на Java:

import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.util.URIUtil;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class URIUtilTest {
    @Test
    void encodeQueryTest() throws URIException {
        assertEquals("https://example.com/search?q=java%2021", URIUtil.encodeQuery("https://example.com/search?q=java 21"));
        assertEquals("https://example.com/search?filter=%7B%7D", URIUtil.encodeQuery("https://example.com/search?filter={}"));
    }
}

В этом примере мы используем метод encodeQuery из класса URIUtil, чтобы закодировать параметры запроса. Это позволяет избежать проблем с пробелами и специальными символами в URL.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь