web-dev-qa-db-fra.com

Pour les API reposantes, la méthode GET peut-elle utiliser des données json?

Je ne veux pas voir une chaîne de paramètres aussi longue dans l'URI. Alors, la méthode GET peut-elle utiliser des données JSON?

Dans ma situation, je dois filtrer le résultat en fonction du type de paramètres. S'il y a beaucoup de paramètres, la longueur peut dépasser la limite de l'URI. Alors, y a-t-il une meilleure pratique pour ce problème?

37
HappyLiang

En théorie, rien ne vous empêche d'envoyer un corps de requête dans une requête GET. Le protocole HTTP le permet, mais n'a pas de sémantique définie, il vous appartient donc de documenter ce qui se passera exactement lorsqu'un client envoie une charge GET. Par exemple, vous devez définir si les paramètres d'un corps JSON sont équivalents aux paramètres de chaîne de requête ou à quelque chose d'autre.

Cependant, en l'absence de sémantique clairement définie, vous n'avez aucune garantie que les implémentations entre votre application et le client la respecteront. Un serveur ou un proxy peut rejeter la totalité de la demande, ou ignorer le corps, ou toute autre chose. Le moyen REST) de gérer les implémentations défectueuses consiste à les contourner de manière découplée de votre application. Je dirais donc que vous disposez de deux options pouvant être considérées comme des meilleures pratiques.

L'option simple consiste à utiliser POST au lieu de GET comme recommandé par d'autres réponses. Puisque POST n'est pas normalisé par HTTP, vous devrez documenter exactement comment cela est supposé fonctionner.

Une autre option, que je préfère, consiste à implémenter votre application en supposant que la charge GET ne soit jamais falsifiée. Ensuite, en cas d'implémentation défectueuse, vous autorisez les clients à remplacer la méthode HTTP par la méthode X-HTTP-Method-Override, qui est une convention populaire chez les clients pour émuler les méthodes HTTP avec POST. Ainsi, si un client a une implémentation endommagée, il peut écrire la demande GET sous forme de POST, en envoyant le X-HTTP-Method-Override: GET et vous pouvez avoir un middleware découplé de votre implémentation d'application et le réécrire en conséquence. C'est la meilleure option si vous êtes un puriste.

32
Pedro Werneck

Pour répondre à votre question, oui, vous pouvez transmettre JSON dans l'URI dans le cadre d'une demande GET (à condition que vous codiez l'URL). Cependant, compte tenu de la longueur de l'URI, l'utilisation de JSON sera vouée à l'échec (en introduisant plus de caractères que nécessaire).

Je vous suggère d’envoyer vos paramètres dans le corps d’une requête POST, soit dans le style CGI habituel (param1=val1&param2=val2) ou JSON (analysé par votre API lors de sa réception)

6
jfrattarola