web-dev-qa-db-fra.com

Codage des paramètres de requête d'URL dans Java

Comment encoder des paramètres de requête pour aller sur une URL en Java? Je sais, cela semble être une question évidente et déjà posée.

Je ne suis pas sûr de deux subtilités:

  1. Les espaces doivent-ils être codés dans l'URL sous la forme "+" ou "% 20"? Dans chrome si je tape "http://google.com/foo=?bar me" chrome le modifie pour qu'il soit codé avec% 20
  2. Est-il nécessaire/correct de coder les deux points ":" en tant que% 3B? Chrome ne le fait pas.

Remarques:

  • Java.net.URLEncoder.encode ne semble pas fonctionner, il semble que le codage des données soit soumis. Par exemple, il code l’espace comme + au lieu de %20, et code deux points qui ne sont pas nécessaires.
  • Java.net.URI ne code pas les paramètres de la requête
95
Alex Black

Java.net.URLEncoder.encode(String s, String encoding) peut aussi aider. Il suit le codage du formulaire HTML application/x-www-form-urlencoded.

URLEncoder.encode(query, "UTF-8");

D'autre part, Pourcentage de codage (également appelé codage d'URL ) code l'espace avec %20. Les deux points sont des caractères réservés, donc : restera toujours deux points, après le codage.

116
Buhake Sindi

EDIT: URIUtil n'est plus disponible dans les versions les plus récentes, mieux vaut répondre à RL Java - encoder ou par M. Sindi dans ce fil de discussion.


URIUtil d'Apache httpclient est vraiment utile, bien qu'il existe quelques alternatives

URIUtil.encodeQuery(url);

Par exemple, il code l’espace comme "+" au lieu de "% 20"

Les deux sont parfaitement valables dans le bon contexte . Bien que si vous préférez vraiment, vous pouvez émettre une chaîne de remplacement.

14
Johan Sjöberg

Malheureusement, URLEncoder.encode () ne produit pas d’encodage valide (comme spécifié dans http://tools.ietf.org/html/rfc3986#section-2.1 ).

URLEncoder.encode () encode parfaitement, à l'exception de l'espace est encodé en "+". Tous les encodeurs d'URI Java) que je ne pouvais trouver que les méthodes publiques exposées pour coder la requête, le fragment, les parties de chemin, etc. - mais n'exposez pas le codage "brut". et query sont autorisés à encoder l'espace en +, nous ne voulons donc pas les utiliser.

La meilleure solution que je pourrais trouver:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

Si replaceAll() est trop lent pour vous, je suppose que l'alternative est de lancer votre propre encodeur ...

EDIT: J'ai eu ce code ici en premier qui ne code pas correctement "?", "&", "=":

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);
11
Kosta

Il n'est pas nécessaire de coder un colon comme% 3B dans la requête, bien que cela ne soit pas illégal.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

Il semble également que seuls les espaces encodés en pourcentage sont valides, car je doute que l’espace soit un ALPHA ou un DIGIT.

regardez la spécification d'URI pour plus de détails.

8
Edwin Buck

Le construit en Java URLEncoder fait ce qu’il est supposé faire, et vous devriez l’utiliser.

Un "+" ou un "% 20" sont les deux remplacements valides d'un caractère d'espacement dans une URL. Soit on travaillera.

Un ":" devrait être encodé, car c'est un caractère séparateur. c'est-à-dire http: // foo ou ftp: // bar . Le fait qu'un navigateur particulier puisse le gérer sans coder ne le rend pas correct. Vous devriez les encoder.

En règle générale, veillez à utiliser la méthode qui utilise un paramètre de codage de caractères. UTF-8 est généralement utilisé ici, mais vous devez le fournir explicitement.

URLEncoder.encode(yourUrl, "UTF-8");
5
rfeak