Qui HTTP méthodes nécessitent un corps?
Une des méthodes HTTP, tels que POST
, besoin d'un corps pour être envoyé après les en-têtes et le double CRLF
.
D'autres, comme GET
, n'ont pas de corps, et pour eux, le double CRLF
marque la fin de la demande.
Mais quid des autres: PUT
, DELETE
, ... comment savoir à qui on demande d'un corps?
Comment faut-il une générique de client HTTP réagir à un inconnu méthode HTTP? De le rejeter? Besoin d'un corps par défaut, ou non besoin d'un corps par défaut?
Un pointeur à la spec serait appréciée.
Modifier : je vais détailler un peu plus ma question, comme l'a demandé dans les commentaires.
Je suis de la conception d'un générique HTTP client qu'un programmeur peut utiliser pour envoyer arbitraire requêtes HTTP vers un serveur.
Le client pourrait être utilisée comme ceci (pseudo-code):
HttpClient.request(method, url [, data]);
Les données sont facultatives et peuvent être des données brutes (string), ou un tableau associatif de paires clé/valeur.
La bibliothèque de l'encoder des données si c'est un array, puis ajouter les données à l'URL d'un GET
demande, ou l'envoyer dans le corps du message pour un POST
demande.
Je suis donc d'essayer de déterminer si cette HttpClient doit/doit/ne doit pas/ne devrait pas inclure un message du corps dans la demande, compte tenu de la méthode HTTP choisi par le développeur.
- générique http client -> generic serveur http.
- ?
- Veuillez expliquer ce que vous essayez de faire. Pourquoi voulez-vous savoir quelles méthodes nécessitent un corps? Voulez-vous écrire un serveur HTTP? Avez-vous fait toute recherche? Aussi le client effectue une requête et détermine ainsi la méthode à utiliser; ainsi, un client ne peut émettre une méthode qu'il ne sait pas. Entendez-vous le serveur? Aussi je ne comprends pas pourquoi vous êtes curieux de savoir quand envoyer un corps. Vous envoyez un corps quand vous savez que vous voulez, donc si vous ne savez pas si vous voulez, vous ne devriez probablement pas.
- Un corps est autorisé pour
GET
juste que cela ne doit pas changer le comportement de laGET
demande (donc, des points de bonus si vous pouvez penser à une réelle utilisation valide pour cet) - Je ne sais pas ce que la méthode est, c'est un client générique je suis de la conception. Veuillez voir ma mise à jour de question.
- Comment le serveur peut-il savoir où la demande se termine alors? J'ai pensé qu'il savait de la méthode, s'il y avait un corps ou pas?
- Voir (en cours) point 2 de @Jordan réponse: "la présence d'un corps est signalé par l'inclusion d'un Contenu ou de Longueur d'Encodage de Transfert de l'en-tête"
- Il est bon de réaliser qu'il ya beaucoup de méthodes HTTP. Beaucoup d'entre eux viennent de WEBDAV. annevankesteren.nl/2007/10/http-methods - et c'est de 2007, donc il existe peut-être encore plus maintenant. Je serais personnellement mis mon accent d'abord sur l'obtention de HTTTP 1.1 RFC droit, et être libéral dans les autres cas.
- Vous pourriez décider d'être plus stricte que la spécification HTTP lui-même. Appliquer le bon sens. Vous obtiendrez des plaintes assez vite si elle s'avère être un problème pour personne. Et avant cela, vous pouvez peut-être faire quelque chose de bon en empêchant certains involontaires ou des requêtes inutiles en cours d'envoi.
- c'est exactement cela! Bonne nouvelle, il y a une stricte règle pour la détermination de cette. Mon erreur a été de supposer qu'il s'agit de la méthode qui a été responsable de la détermination, et non pas ces en-têtes comme nous le savons maintenant.
- Merci pour vos commentaires. Je vais être en mesure d'appliquer le bon sens maintenant que je obtenir une image plus large!
- Oui, la bonne stratégie. Le sens commun n'est pas si courant après tout, dans ce contexte. Je n'aurais pas deviné avant de Googler qu'il y a tellement de méthodes HTTP!
- Ne vous n'avez pas de cas d'utilisation où les navigateurs (le client) peuvent aussi en faire la demande? ou serait-il juste de votre mise en œuvre de client générique? Je ne pense pas que tous webDAV méthodes sont pris en charge par les navigateurs.
- Non, je ne sais pas (encore), mais il semble que la plupart des navigateurs déjà l'appui de la demande de méthodes au-delà de GET/POST via XMLHttpRequest. En outre, un développeur peut très bien concevoir un service HTTP pour un autre client que d'un navigateur web, et dans ce cas il aurait besoin d'un très générique de mise en œuvre pour s'y connecter!
- J'ai eu exactement ce question/problème et a réalisé que les paramètres URI (?query=quoi que ce soit) doit pas être confondue avec le corps du message dans votre client HTTP de l'interface. Ils devraient être traités séparément.
Vous devez vous connecter pour publier un commentaire.
EDIT: liste compilée:
Content-Length
ouTransfer-Encoding
en-tête (section 4.3)Pour les réponses, ce qui a été défini:
Ce RFC (7231) Ou Ce version (De l'IETF & Plus En Profondeur) est ce que vous voulez. Selon la RFC:
Pour
PUT
:Et pour
DELETE
:De vos commentaires que je reçois, vous êtes en train de rédiger un client HTTP bibliothèque (pourquoi n'existe-il pas assez?) et que vous souhaitez autoriser pour un générique
request(method, url[, data])
méthode. Vous voulez savoir à quoimethod
ladata
est requis ou interdit.Il suffit de supposer que l'utilisateur de votre bibliothèque sait ce qu'ils font. Si je veux envoyer un corps avec une requête GET je peux, parce que la spécification ne vous interdit pas de cela. Alors pourquoi votre bibliothèque?
En outre, la spécification HTTP est ouvert dans le présent; une extension de HTTP (comme WebDAV) peut spécifier de nouvelles méthodes (verbes) que faire ou ne pas autoriser ou même exiger un corps de message.
Je pense que l'effort actuel peut être mieux dépensé sur des parties plus importantes.
Je vais répondre à cette:
Aucune demande n'est nécessaire pour inclure un corps, bien que l'absence de corps pourrait être interprété comme un vide du corps ou de l'une de longueur zéro.
RFC2616 4.3 les états:
...
En passant par les méthodes en 5.1.1 (à l'exclusion de toute extension des méthodes de), vous trouverez:
...
Donc techniquement aucune des autres méthodes de demande:
... pourrait inclure un corps. Retour à la 4.3:
Donc, en réponse à une demande inattendue de l'entité-corps pour une méthode ou d'une ressource, il est sûr d'ignorer et d'y répondre, y compris le code, comme si le corps n'a pas été envoyé.
Référence: RFC2616 Protocole de Transfert Hypertexte -- HTTP/1.1
Edit: RFC2616 est bel et bien obsolète, reportez-vous à RFC7230 pour les dernières spécifications.
Pour les méthodes arbitraires, ou de la validité de la méthode qui vous ne voulez pas de soutien à côté serveur
HTTP Status Code 405
doit être renvoyé à l'appelant.Comme par http://en.wikipedia.org/wiki/List_of_HTTP_status_codes:
Vous voudrez peut-être lire l'actuel HTTP spec projet de la section sur le corps du message, longueur: http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p1-messaging-22.html#message.body.length