Какой лучший способ избавиться от получения параметров из строки url?
У меня есть строка URL как:
" http://www.xyz/path1/path2/path3?param1=value1¶m2=value2".
Мне нужно получить этот url без параметров, поэтому результат должен быть:
" http://www.xyz/path1/path2/path3".
Я сделал это следующим образом:
private String getUrlWithoutParameters(String url)
{
return url.substring(0,url.lastIndexOf('?'));
}
Есть ли лучшие способы сделать это?
Ответы
Ответ 1
Вероятно, это не самый эффективный способ, но более безопасный тип:
private String getUrlWithoutParameters(String url) throws URISyntaxException {
URI uri = new URI(url);
return new URI(uri.getScheme(),
uri.getAuthority(),
uri.getPath(),
null, // Ignore the query part of the input url
uri.getFragment()).toString();
}
Ответ 2
Обычно я использую
url.split("\\?")[0]
Ответ 3
Используя javax.ws.rs.core.UriBuilder из JAX-RS 2.0:
UriBuilder.fromUri("https://www.google.co.nz/search?q=test").replaceQuery(null).build();
Используя очень похожий org.springframework.web.util.UriBuilder из Spring:
UriComponentsBuilder.fromUriString("https://www.google.co.nz/search?q=test").replaceQuery(null).build(Collections.emptyMap());
Ответ 4
Попробуйте использовать метод String и indexOf в строке:
String str = "http://www.xyz/path1/path2/path3?param1=value1¶m2=value2";
int index = str.indexOf("?");
if (index != -1) {
System.out.println(str.substring(0, str.indexOf("?")));
} else {
System.out.println("You dont have question mark in your url");
}
Ответ 5
С помощью URL это можно сделать методами. Со строкой:
url = url.replaceFirst("\\?.*$", "");
Это попытка заменить все, начиная с вопросительного знака. Когда нет знака вопроса, оригинальная строка сохраняется.
Ответ 6
ok, я подведу итог:
Тестовый код:
package com.stackoverflow.test;
import java.net.URI;
import java.net.URISyntaxException;
public class TestOfRemovingParameteresFromString {
private final static int NUMBER_OF_ITERATIONS = 1000000;
private final static String TEST_URL_SRTRING = "http://www.xyz/path1/path2/path3?param1=value1¶m2=value2";
private static String getUrlWithoutParameters(String url) throws URISyntaxException {
URI uri = new URI(url);
return new URI(uri.getScheme(), uri.getAuthority(), uri.getPath(), null, uri.getFragment()).toString();
}
public static void main(String[] args) throws URISyntaxException {
long startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.split("\\?")[0];
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.substring(0, TEST_URL_SRTRING.indexOf("?"));
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.substring(0, TEST_URL_SRTRING.indexOf('?'));
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.substring(0, TEST_URL_SRTRING.lastIndexOf('?'));
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.replaceFirst("\\?.*$", "");
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = getUrlWithoutParameters(TEST_URL_SRTRING);
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
}
}
Вывод:
Результат = 353
Результат = 54
Result = 29
Результат = 37
Result = 1086
Result = 1647
Итак, самый быстрый - третий:
startTime = System.currentTimeMillis();
for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
String result = TEST_URL_SRTRING.substring(0, TEST_URL_SRTRING.indexOf('?'));
}
System.out.println("Result=" + (System.currentTimeMillis() - startTime));
Ответ 7
Вы можете использовать что-то вроде следующего, которое удаляет часть запроса из URL.
private String getUrlWithoutParameters(String url) throws MalformedURLException {
return url.replace(new URL(url).getQuery(), "");
}
В качестве альтернативы вы можете проверить, соответствует ли перезапись URL вашим потребностям: http://tuckey.org/urlrewrite/
Ответ 8
Вы можете использовать org.apache.http.client.utils.URIBuilder
из httpclient jar
@Test
void test_removeQueryParameters() throws Exception {
String url = "http://www.google.com?query=Shanghai&foo=bar";
String expectedUrl = "http://www.google.com";
String result = removeQueryParameters(url);
Assert.assertThat(result, equalTo(expectedUrl));
}
public String removeQueryParameters(String url) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(url);
uriBuilder.removeQuery();
return uriBuilder.build().toString();
}
Ответ 9
Добавление к ответу @Eran'а и для полноты картины дает один способ, просто используя removeQuery(regEx)
.
private String getUrlWithoutParameters(String url) throws URISyntaxException {
return new URI(url).removeQuery(/.*?/g).toString();
}