Table des matières
A quoi servent les Query String ?
J'ai toujours utilisé les Query Strings Parameters pour envoyer des informations lors d'une requête.
Par exemple avec un formulaire:
<form action="/path/of/target" method="get">
<input type="text" name="foo" />
<input type="text" name="bar" />
<input type="submit" />
</form>
L'envoi de ce formulaire va se faire avec une Query String de la forme suivante: /path/of/target?foo=toto&bar=tata
Mais il peut aussi être utilisé comme "cache buster" si le serveur utilise l'url comme identifiant de la ressource.
https://my.domain.fr/file?v=1
https://my.domain.fr/file?v=2
https://my.domain.fr/file?v=3
De cette manière, on est certain de récupérer la dernière version du fichier à chaque appel si on change toujours le paramètre ?v=N
Comment passer des structures complexes ?
Dans mon exemple précedent, mon formulaire a généré un objet qu'il a envoyé via la requête à la page /path/of/target
. Cet objet pourrait ressembler à ceci:
{
"foo": "tata",
"bar": "toto"
}
Mais comment puis-je passer des objets plus complets à /path/of/target
? Comme par exemple la structure suivante:
{
"embed": {
"foo": "tata",
"bar": 123
},
"list": [1, 2, 3]
}
Pour tester en php, je vais créer le script suivant:
<?php
var_dump($_GET);
J'exécute la commande php -S localhost:9999
pour lancer un serveur avec la page et j'essaye de l'appeler avec http://localhost:9999/?embed[foo]=tata&embed[bar]=123&list[0]=1&list[1]=2&list[2]=3
Le résultat est le suivant:
/Labs/php/query-string/index.php:3:
array (size=2)
'embed' =>
array (size=2)
'foo' => string 'tata' (length=4)
'bar' => string '123' (length=3)
'list' =>
array (size=3)
0 => string '1' (length=1)
1 => string '2' (length=1)
2 => string '3' (length=1)
La structure est bonne, même si les valeurs embed.bar
et list[x]
sont en chaîne de caractères et pas en nombres.
Conclusion
Les Query String Parameters s'utilisent principalement avec la méthode GET
, donc pour de la lecture de données.
La plupart du temps, je les utilise pour envoyer des filtres à une requête GET
et dans 99% des cas, les filtres sont simples et la Query String ressemble à ?filtre1=value1&filtre2=value2&...
.
Quand il est nécéssaire de passer un objet plus compliqué, je me pose les questions suivantes:
- Est ce que je dois utiliser
POST
à la place deGET
? - Est ce que la taille de la Query String ne va pas devenir trop importante (ce qui pourrait diminuer la lisibilité de l'URL ou, encore pire, être tronqué lors d'un copié collé)?
- Est ce que le langage qui va interpréter la requête fonctionne de la même manière que
$_GET
de php ?
En conclusion, utilisez la Query String pour des choses simples !