825 Stimmen

Java-URL-Kodierung von Query-String-Parametern

Angenommen, ich habe eine URL

http://example.com/query?q=

und ich habe eine vom Benutzer eingegebene Abfrage wie z.B.:

Zufallswort £500 Bank $

Ich möchte, dass das Ergebnis eine korrekt kodierte URL ist:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

Wie kann man das am besten erreichen? Ich habe versucht URLEncoder und die Erstellung von URI/URL-Objekten, aber keines davon ist wirklich gut gelungen.

7voto

Neets Punkte 3947

Verwendung von Frühling 's UriComponentsBuilder :

UriComponentsBuilder
        .fromUriString(url)
        .build()
        .encode()
        .toUri()

5voto

Pellet Punkte 2056

Hier ist eine Methode, die Sie in Ihrem Code verwenden können, um eine URL-Zeichenfolge und eine Zuordnung von Parametern in eine gültige kodierte URL-Zeichenfolge zu konvertieren, die die Abfrageparameter enthält.

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

3voto

Unter Android würde ich diesen Code verwenden:

Uri myUI = Uri.parse("http://example.com/query").buildUpon().appendQueryParameter("q", "random word A3500 bank 24").build();

Wo Uri es un android.net.Uri

1voto

Laurent Punkte 337

In meinem Fall musste ich nur die gesamte URL übergeben und nur den Wert der einzelnen Parameter kodieren. Ich habe keinen gemeinsamen Code gefunden, um das zu tun, so (!!), so dass ich diese kleine Methode erstellt, um die Arbeit zu tun:

public static String encodeUrl(String url) throws Exception {
    if (url == null || !url.contains("?")) {
        return url;
    }

    List<String> list = new ArrayList<>();
    String rootUrl = url.split("\\?")[0] + "?";
    String paramsUrl = url.replace(rootUrl, "");
    List<String> paramsUrlList = Arrays.asList(paramsUrl.split("&"));
    for (String param : paramsUrlList) {
        if (param.contains("=")) {
            String key = param.split("=")[0];
            String value = param.replace(key + "=", "");
            list.add(key + "=" +  URLEncoder.encode(value, "UTF-8"));
        }
        else {
            list.add(param);
        }
    }

    return rootUrl + StringUtils.join(list, "&");
}

public static String decodeUrl(String url) throws Exception {
    return URLDecoder.decode(url, "UTF-8");
}

Sie verwendet Apache Commons' org.apache.commons.lang3.StringUtils .

0voto

Xuelian Han Punkte 57
  1. Verwenden Sie diese

     URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());

    oder dies:

     URLEncoder.encode(query, "UTF-8");
  2. Sie können den folgenden Code verwenden.

     String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8"); // No change
     String encodedUrl2 = URLEncoder.encode(query, "UTF-8"); // Changed
     String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName()); // Changed
    
     System.out.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X