Comment encoder les 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.
Il y a deux subtilités dont je ne suis pas sûr:
- Les espaces doivent-ils être encodés sur 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 encodé avec% 20
- Est-il nécessaire / correct de coder les deux points ":" comme% 3B? Chrome ne le fait pas.
Remarques:
java.net.URLEncoder.encode
ne semble pas fonctionner, il semble que ce soit pour le codage des données à soumettre. Par exemple, il encode l'espace comme+
au lieu de%20
et encode deux-points, ce qui n'est pas nécessaire.java.net.URI
n'encode pas les paramètres de requête
application/x-www-form-urlencoded
des paires clé / valeur. Voir ici pour en savoir plus : legalargumentexception.blogspot.com/2009/12/…Réponses:
java.net.URLEncoder.encode(String s, String encoding)
peut aussi aider. Il suit l'encodage du formulaire HTMLapplication/x-www-form-urlencoded
.D'autre part, l' encodage en pourcentage (également appelé encodage URL ) encode l'espace avec
%20
. Deux-:
points est un caractère réservé, il restera donc toujours des deux points, après l'encodage.la source
URLEncoder
est conforme auapplication/x-www-form-urlencoded
format MIME (qui est un encodage de formulaire HTML valide). Je suppose que ce n'est pas ce que vous recherchez.http://example.com/?url=http://example.com/?q=c&sort=name
. Doit-il encoder&sort=name
ou non? Il n'y a aucun moyen de distinguer la valeur de l'URL. C'est la raison exacte pour laquelle vous avez besoin d'un encodage de valeur en premier lieu.EDIT:
URIUtil
n'est plus disponible dans les versions plus récentes, meilleure réponse à Java - encoder l'URL ou par M. Sindi dans ce fil.URIUtil
d'Apache httpclient est vraiment utile, bien qu'il existe des alternativesLes deux sont parfaitement valables dans le bon contexte . Bien que si vous préférez vraiment, vous pouvez émettre une chaîne de remplacement.
la source
URIUtil.encodeWithinQuery
est ce que vous utiliseriez pour encoder un paramètre de requête individuel, ce que la question d'origine semblait poser.Malheureusement, URLEncoder.encode () ne produit pas de codage en pourcentage valide (comme spécifié dans la RFC 3986 ).
URLEncoder.encode () encode tout très bien, sauf que l' espace est encodé en "+". Tous les encodeurs URI Java que j'ai pu trouver n'exposent que des méthodes publiques pour encoder la requête, le fragment, les parties de chemin, etc. - mais n'exposent pas l'encodage «brut». C'est malheureux car le fragment et la requête sont autorisés à coder l'espace en +, nous ne voulons donc pas les utiliser. Le chemin est codé correctement mais est d'abord «normalisé», nous ne pouvons donc pas non plus l'utiliser pour un codage «générique».
Meilleure solution que je pourrais trouver:
Si
replaceAll()
c'est trop lent pour vous, je suppose que l'alternative est de rouler votre propre encodeur ...EDIT: J'ai eu ce code ici en premier qui n'encode pas "?", "&", "=" Correctement:
la source
+
est un encodage parfaitement valide d'un espace.+
peut être mal interprété - jetez un œil à C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…encodeURIComponent
sortie de la méthode Javascript , et c'était la seule correspondance exacte pour celles que j'ai essayées (requêtes avec des espaces, des caractères spéciaux turcs et allemands).Il n'est pas nécessaire de coder un deux-points en tant que% 3B dans la requête, bien que cela ne soit pas illégal.
Il semble également que seuls les espaces codés en pourcentage soient valides, car je doute que l'espace soit un ALPHA ou un DIGIT
consultez la spécification URI pour plus de détails.
la source
application/x-www-form-urlencoded
chaîne de requête, l'un ou l'autre convient. Si vous corrigez une URL que l'utilisateur a tapée / collée, elle:
doit rester seule.L'URLEncoder Java intégré fait ce qu'il est censé faire, et vous devriez l'utiliser.
Un "+" ou "% 20" sont tous deux des remplacements valides pour un caractère d'espace dans une URL. L'un ou l'autre fonctionnera.
Un ":" doit être codé, car c'est un caractère de séparation. ie http: // toto ou ftp: // bar . Le fait qu'un navigateur particulier puisse le gérer lorsqu'il n'est pas codé ne le rend pas correct. Vous devez les encoder.
Par bonne pratique, veillez à utiliser la méthode qui prend un paramètre de codage de caractères. UTF-8 y est généralement utilisé, mais vous devez le fournir explicitement.
la source
+
n'est qu'une représentation de l'espace dansapplication/x-www-form-urlencoded
; il n'est pas garanti de fonctionner même lorsqu'il est limité à HTTP. De même,:
est valide dans une chaîne de requête et ne doit pas être converti en%3B
; un serveur peut choisir de les interpréter différemment.http://
à cehttp%3A%2F%2F
qui est inexacthttp://
pièce. La méthode concerne les paramètres de requête et les données de formulaire codées. Si, cependant, vous vouliez passer l'URL d'un autre site Web en tant que paramètre de requête, ALORS vous voudrez l'encoder pour éviter de confondre l'analyseur d'URL.application/x-www-form-urlencoded
type de contenu. Cela ne signifie-t-il pas que cela doit fonctionner pour HTTP?si vous avez seulement un problème d'espace dans l'url. J'ai utilisé le code ci-dessous et cela fonctionne bien
exemple: l'url est
alors la sortie de muUrl est
la source
J'ai observé en cas de Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
ne fonctionne pas.la source