Requête HTTP GET charge utile
Je suis en train de concevoir une API et je me demande si c'est bien d'envoyer une charge utile JSON sur une requête GET?
Dans cette autre question Les charges de la Demande de HTTP Méthodes, on peut trouver, selon ce lien:
- TÊTE - N'a été définie dans le corps de la sémantique.
- GET - N'a été définie dans le corps de la sémantique.
- METTEZ - Corps pris en charge.
- POST - Corps pris en charge.
- SUPPRIMER - N'a été définie dans le corps de la sémantique.
- TRACE, un Corps qui n'est pas pris en charge.
- OPTIONS - Corps pris en charge, mais pas de sémantique (peut-être dans le futur).
Est-ce à dire que je ne devrais pas envoyer une requête GET avec une charge utile?
Existe-il des risques?
- Comme ayant une certaine client HTTP bibliothèques incapable de l'envoi d'une telle charge?
- Ou mon API Java code qui n'est pas portable sur certains serveurs d'application?
- Autre chose?
J'ai trouvé que ElasticSearch a été l'utilisation d'une telle charge utile sur une requête GET:
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
Donc, si ce populaire libary le fait et personne ne se plaint, alors peut-être que je peux faire de même?
Par la voie, je voudrais savoir si c'est OK pour mélanger les paramètres de chaîne de requête et de la charge utile JSON? Exactement comme ce ElasticSearch requête ne. Si oui, sont-il des règles afin que nous sachions quels sont les arguments qui doivent être queryString des paramètres ou des paramètres de charge utile?
Ici, nous pouvons lire:
HTTP GET avec le corps de la requête
Roy Fielding commentaire sur l'inclusion d'un corps avec une requête GET.
Oui. En d'autres termes, toute requête HTTP message est autorisé à contenir un
le corps du message, et doit donc analyser les messages avec cela à l'esprit. Serveur
la sémantique pour l'OBTENIR, cependant, sont restreints tels qu'un organisme, le cas échéant,
a pas de sens sémantique de la demande. Les exigences sur l'analyse
sont séparés les prescriptions relatives à la méthode de la sémantique.Donc, oui, vous pouvez envoyer un corps avec elle, et non, il n'est jamais utile d'
le faire.C'est la partie de la couche de conception de HTTP/1.1 qui deviendra clair
encore une fois la spécification est partitionné (travaux en cours).....Roy
Alors je ne comprends vraiment pas pourquoi il n'est jamais utile, parce qu'il fait sens à mon avis, pour envoyer des requêtes complexes pour le serveur qui ne serait pas bien sur queryParam ou matrixParam.
Je pense que ElasticSearch API concepteurs pensent la même chose...
Je suis la planification à la conception d'une API qui peut être appelé comme ça:
curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
"someSearchFilter1":"filterValue1",
"someSearchFilter2":"filterValue2",
"someSearchFilterList": ["filterValue3","xxx"]
... a lot more ...
}
'
Semble-t-il fine pour vous? Basé sur les considérations ci-dessus.
OriginalL'auteur Sebastien Lorber | 2013-05-03
Vous devez vous connecter pour publier un commentaire.
Avoir l'OBTENIR de réponse varient en fonction de la demande du corps va briser la mise en cache. Ne pas y aller.
Sont tous intermediaties/bibliothèques au courant de cela?
pour sûr, parce que ils ont besoin pour obtenir l'accès à un OAuth2 jeton qui leur permet de manipuler un compte d'utilisateur. Ainsi, l' /profil de ressource est le profil de l'utilisateur pour lequel le client a la OAuth2 jeton (donné à titre d'en-Tête)
Puisque vous avez mentionné sur ElasticSearch, eh bien, tous les la requête GET avec un point de terminaison comme /_search et /_count a, comme un compromis, un POSTE équivalent.
OriginalL'auteur
Google App Engine, un populaire framework web, utilise une url spéciale extraire de la bibliothèque, qui ne supporte pas de faire des requêtes HTTP GET avec une charge utile de. Par conséquent, si vous voulez que votre API pour atteindre Google App Engine utilisateurs, alors je ne recommanderais pas besoin de ce comportement.
J'ai ouvert une question au sujet de cette avec google.
GET
demande, vous pouvez urlencode le corps de la demande dans lesource
la chaîne de la requête de paramètre au lieu de l'envoyer avec le corps de la demande.OriginalL'auteur
Voir aussi: HTTP GET avec le corps de la requête - pour plus de détails sur cette.
L'essentiel est: Oui, vous pouvez, mais vous ne devriez probablement pas, pour diverses raisons, y compris:
OriginalL'auteur
Juste parce que vous peut faire quelque chose, ne signifie pas que vous devrait. Je suis désolé si cela sonne infuriatingly tautologique, mais la chose au sujet des normes est qu'elles sont standard - et HTTP est l'un des la plupart des normes établies, il est. Il n'est pas parfait, et il y a beaucoup de choses que beaucoup de gens aimeraient changer de sujet, mais le fait que presque tout le monde est encore à l'aide de paramètres d'URL pour les cas d'utilisation tels que c'est à moi d'indication suffisante qu'il ne sont pas fiables alternatives à droite maintenant.
Les réponses de speedplane et Julian Reschke donner deux exemples concrets de choses qui vont se briser si vous comptez sur les requêtes GET avec un corps/charge utile. Vous pouvez écrire votre application différemment de tous les autres, si vous voulez, mais le web est un domaine où les normes devraient peut-être prendre encore plus au sérieux que la normale. Je sais que c'est tentant d'être un pionnier, mais avec tout le respect dû, pensez juste comment de nombreux sites existent, et combien de programmeurs web il y a la construction et le maintien. S'il était définitivement la meilleure façon, vous seriez probablement voir largement utilisé dans la production.
Normes modifier/sont adoptées lentement parce que beaucoup de gens ont à s'entendre sur eux pour qu'ils fonctionnent. Vous avez raison en disant qu'il y sont applications qui enfreignent les règles, mais vous remarquerez qu'ils ont causé des maux de tête pour les gens, et les solutions de contournement/redondance des mesures sont nécessaires dans certains cas, comme mentionné par Aetherus dans son commentaire sur une autre réponse. J'ai tendance à prendre le chemin de moindre résistance sur les questions de ce genre. Si vous voulez vraiment le faire, je suis sûr que vous pouvez le faire fonctionner, cependant.
OriginalL'auteur