Java: Кодирование параметров строки запроса в URL
У меня есть 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 ответ(ов)
Вы можете использовать следующий метод в вашем коде для преобразования строки 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
, так как кодирование может вызвать это исключение.
В 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".
Чтобы закодировать строку запроса в Java, вы можете использовать один из следующих способов:
Используйте этот код:
URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());
или этот:
URLEncoder.encode(query, "UTF-8");
Вы можете использовать следующий код:
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
приводит к изменению строки.
Вы можете использовать библиотеку 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.
Кодирование URL в JavaScript
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Eclipse/Java: не работает автозавершение кода
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки