Какой лучший способ избавиться от получения параметров из строки url?

У меня есть строка URL как:

" http://www.xyz/path1/path2/path3?param1=value1&param2=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&param2=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&param2=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();

}