web-dev-qa-db-fra.com

Comment puis-je ajouter un paramètre de requête à une URL existante?

J'aimerais ajouter une paire clé-valeur en tant que paramètre de requête à une URL existante. Bien que je puisse le faire, je vérifie si l’URL contient une partie requête ou une partie fragment et je fais l’ajout en sautant à travers un tas de clauses if, mais je me demandais s’il existait un moyen propre de le faire via Apache. Bibliothèques communes ou quelque chose d'équivalent.

http://example.com serait http://example.com?name=John

http://example.com#fragment serait http://example.com?name=John#fragment

http://[email protected] serait http://[email protected]&name=John

http://[email protected]#fragment serait http://[email protected]&name=John#fragment

J'ai déjà exécuté ce scénario plusieurs fois auparavant et j'aimerais le faire sans casser l'URL de quelque manière que ce soit.

33

Cela peut être fait en utilisant Java.net.URI class pour construire une nouvelle instance en utilisant les pièces d'un composant existant, afin de garantir sa conformité à la syntaxe URI.

La partie requête sera soit null soit une chaîne existante, vous pouvez donc décider d'ajouter un autre paramètre avec & ou de démarrer une nouvelle requête.

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"));
    }
}

Sortie

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

Il existe de nombreuses bibliothèques qui peuvent vous aider avec la construction d’URI (ne réinventez pas la roue). Voici trois pour vous aider à démarrer:


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.LELEASE

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

Voir aussi:Gist> Tests de URI Builder

106
Nick Grealy

Utilisez la classe URI .

Créez une nouvelle URI avec votre String existante pour la "diviser" en parties, et en instancier une autre pour assembler l'URL modifiée:

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());
5
icza

Je suggère une amélioration de la réponse d'Adam en acceptant HashMap comme paramètre

/**
 * 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();
}
0
tryp

Kotlin & clean, afin que vous n'ayez pas à refactoriser avant la révision du code

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()
    }