Подтвердить что ты не робот

Как добавить параметр запроса к существующему URL?

Я хотел бы добавить пару ключ-значение в качестве параметра запроса к существующему URL-адресу. Хотя я мог бы сделать это, проверив, существует ли у URL-адреса часть запроса или фрагментарная часть и выполняется добавление, прыгая через кучу if-clauses, но мне было интересно, если бы был чистый способ, если это сделать через Apache Библиотеки Commons или что-то подобное.

http://example.com будет http://example.com?name=John

http://example.com#fragment будет http://example.com?name=John#fragment

http://[email protected] будет http://[email protected]&name=John

http://[email protected]#fragment будет http://[email protected]&name=John#fragment

Я запускал этот сценарий много раз раньше, и я хотел бы сделать это, не нарушая URL-адреса.

4b9b3361

Ответ 1

Это можно сделать, используя класс java.net.URI для создания нового экземпляра с использованием частей из существующего, это должно обеспечить соответствие URI синтаксис.

Часть запроса будет либо пустой, либо существующей строкой, поэтому вы можете решить добавить другой параметр в и/или начать новый запрос.

public class StackOverflow26177749 {

    public static URI appendUri(String uri, String appendQuery) throws URISyntaxException {
        URI oldUri = new URI(uri);

        String newQuery = oldUri.getQuery();
        if (newQuery == null) {
            newQuery = appendQuery;
        } else {
            newQuery += "&" + appendQuery;  
        }

        URI newUri = new URI(oldUri.getScheme(), oldUri.getAuthority(),
                oldUri.getPath(), newQuery, oldUri.getFragment());

        return newUri;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(appendUri("http://example.com", "name=John"));
        System.out.println(appendUri("http://example.com#fragment", "name=John"));
        System.out.println(appendUri("http://[email protected]", "name=John"));
        System.out.println(appendUri("http://[email protected]#fragment", "name=John"));
    }
}

Выход

http://example.com?name=John
http://example.com?name=John#fragment
http://[email protected]&name=John
http://[email protected]&name=John#fragment

Ответ 2

Существует множество библиотек, которые могут помочь вам в создании URI (не изобретать велосипед). Вот три, чтобы вы начали:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents: httpclient: 4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework: spring -web: 4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

См. также: GIST > Тесты URI Builder

Ответ 3

Используйте класс URI.

Создайте новый URI с существующей String чтобы "разбить его" на части, и создайте другой экземпляр для сборки измененного URL:

URI u = new URI("http://[email protected]&name=John#fragment");

// Modify the query: append your new parameter
StringBuilder sb = new StringBuilder(u.getQuery() == null ? "" : u.getQuery());
if (sb.length() > 0)
    sb.append('&');
sb.append(URLEncoder.encode("paramName", "UTF-8"));
sb.append('=');
sb.append(URLEncoder.encode("paramValue", "UTF-8"));

// Build the new url with the modified query:
URI u2 = new URI(u.getScheme(), u.getAuthority(), u.getPath(),
    sb.toString(), u.getFragment());

Ответ 4

Я предлагаю улучшить ответ Адама, приняв HashMap в качестве параметра

/**
 * Append parameters to given url
 * @param url
 * @param parameters
 * @return new String url with given parameters
 * @throws URISyntaxException
 */
public static String appendToUrl(String url, HashMap<String, String> parameters) throws URISyntaxException
{
    URI uri = new URI(url);
    String query = uri.getQuery();

    StringBuilder builder = new StringBuilder();

    if (query != null)
        builder.append(query);

    for (Map.Entry<String, String> entry: parameters.entrySet())
    {
        String keyValueParam = entry.getKey() + "=" + entry.getValue();
        if (!builder.toString().isEmpty())
            builder.append("&");

        builder.append(keyValueParam);
    }

    URI newUri = new URI(uri.getScheme(), uri.getAuthority(), uri.getPath(), builder.toString(), uri.getFragment());
    return newUri.toString();
}

Ответ 5

Kotlin & clean, так что вам не придется рефакторинг перед проверкой кода:

private fun addQueryParameters(url: String?): String? {
        val uri = URI(url)

        val queryParams = StringBuilder(uri.query.orEmpty())
        if (queryParams.isNotEmpty())
            queryParams.append('&')

        queryParams.append(URLEncoder.encode("$QUERY_PARAM=$param", Xml.Encoding.UTF_8.name))
        return URI(uri.scheme, uri.authority, uri.path, queryParams.toString(), uri.fragment).toString()
    }