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.


Un seul risque serait que les bibliothèques client n'a pas permis à manipuler pour être envoyé dans une requête GET. Je ne savais même pas que vous pourriez faire cela avec curl, honnêtement.

OriginalL'auteur Sebastien Lorber | 2013-05-03