web-dev-qa-db-fra.com

Dans une URL, les espaces doivent-ils être codés avec% 20 ou +?

Dans une URL, dois-je encoder les espaces en utilisant %20 Ou +? Par exemple, dans l'exemple suivant, lequel est correct?

www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360

Notre société s’appuie sur l’ancien, mais en utilisant la méthode Java URLEncoder.encode(String, String)) _ avec "xbox 360" (Et "UTF-8") renvoie le dernier .

Alors, quelle est la différence?

107
MegaByter

Les données de formulaire (pour GET ou POST) sont généralement codées comme suit: application/x-www-form-urlencoded: ceci spécifie + pour les espaces.

Les URL sont codées comme RFC 1738 qui spécifie %20.

En théorie, je pense que vous devriez avoir% 20 avant le ? et + après:

example.com/foo%20bar?foo+bar
96
Greg

Selon W3C (et ils sont la source officielle de ces choses), un caractère d'espacement dans la chaîne de requête (et dans la chaîne de requête uniquement) peut être codé comme suit: "%20 "ou" + ". Dans la section "Chaînes de requête" sous "Recommandations":

Dans la chaîne de requête, le signe plus est réservé en tant que notation abrégée pour un espace. Par conséquent, les signes plus réels doivent être codés. Cette méthode a été utilisée pour faciliter la transmission des URI de requête dans des systèmes n'autorisant pas d'espaces.

Selon la section 3.4 de la RFC2396 qui est la spécification officielle des URI en général, le composant "query" dépend de l'URL:

3.4. Composant de requête Le composant de requête est une chaîne d'informations à interpréter par la ressource.

   query         = *uric

Dans un composant de requête, les caractères ";", "/", "?", ":", "@", "&", "=", "+", "," Et "$" sont réservés.

Il s'agit donc d'un bogue dans l'autre logiciel s'il n'accepte pas les URL avec des espaces dans la chaîne de requête codée sous la forme de caractères "+".

Pour ce qui est de la troisième partie de votre question, un moyen (bien que légèrement moche) de corriger la sortie de URLEncoder.encode() consiste alors à appelreplaceAll("\\+","%20") sur la valeur de retour .

47
Adam Batkin

Cette confusion est due au fait que l'URL est encore "cassée" à ce jour

Prenez " http://www.google.com " par exemple. Ceci est une URL. Une URL est un localisateur de ressources uniforme et est en réalité un pointeur sur une page Web (dans la plupart des cas). Les URL ont en fait une structure très bien définie depuis la première spécification de 1994.

Nous pouvons extraire des informations détaillées sur l'URL " http://www.google.com ":

+---------------+-------------------+   
|      Part     |      Data         |   
+---------------+-------------------+   
|  Scheme       | http              |   
|  Host address | www.google.com    |   
+---------------+-------------------+  

Si nous examinons une URL plus complexe telle que " https: // bob: [email protected]: 8080/file; p = 1? Q = 2 # third " nous pouvons extraire le information suivante:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host address     | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file               |
|  Path parameters  | p=1                 |
|  Query parameters | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

Les caractères réservés sont différents pour chaque partie

Pour les URL HTTP, un espace dans une partie de fragment de chemin doit être codé en "% 20" (pas, absolument pas "+"), tandis que le caractère "+" dans la partie de fragment de chemin peut être laissé non codé.

Désormais, dans la partie requête, les espaces peuvent être codés avec "+" (pour des raisons de compatibilité ascendante: n'essayez pas de le rechercher dans le standard URI) ou avec "% 20" tandis que le caractère "+" (en raison de cette ambiguïté). ) doit être échappé à "% 2B".

Cela signifie que la chaîne "blue + light blue" doit être codée différemment dans les éléments de chemin et de requête: " http://example.com/blue+light%20blue?blue%2Blight+blue ". De là, vous pouvez en déduire qu'il est impossible de coder une URL entièrement construite sans une connaissance syntaxique de la structure de l'URL.

Qu'est-ce que cela revient à est

vous devriez avoir %20 avant le ? et + après

Source

14
Matas Vaitkevicius

Cela ne devrait pas importe pas plus que si vous encodiez la lettre A sous la forme% 41.

Toutefois, si vous utilisez un système qui ne reconnaît pas un formulaire, il semble que vous devrez simplement lui donner ce à quoi il s'attend, indépendamment de ce que la "spécification" dit.

6
Gary McGill

Vous pouvez utiliser soit - ce qui signifie que la plupart des gens optent pour "+" car il est plus lisible par l'homme.

5
Fenton