Quatre méthodes courantes de soumission des données POST
Nous savons que le protocole HTTP est transmis en code ASCII et est une spécification de couche application basée sur le protocole TCP/IP. La spécification divise les requêtes HTTP en trois parties : la ligne d'état, les en-têtes de requête et le corps du message. Similaire à ce qui suit :
<method> <request-url> <version><headers> <entity-body></entity-body></headers></version></request-url></method>
Le protocole stipule que les données soumises par POST doivent être placées dans le corps du message (entité-corps), mais le protocole ne précise pas quelle méthode d'encodage les données doit utiliser. En fait, les développeurs peuvent décider eux-mêmes du format du corps du message, à condition que la dernière requête HTTP envoyée respecte le format ci-dessus.
Cependant, avant que les données ne soient envoyées, cela n'a de sens que si le serveur les analyse avec succès. Les langages généraux côté serveur tels que php, python, etc., et leurs frameworks ont des fonctions intégrées pour analyser automatiquement les formats de données courants. Le serveur apprend généralement comment le corps du message dans la requête est codé en fonction du champ Content-Type dans les en-têtes de la requête, puis analyse le corps. Ainsi, lorsqu'il s'agit du schéma de données de soumission POST, il comprend deux parties : le type de contenu et la méthode d'encodage du corps du message. Commençons officiellement à les présenter.
application/x-www-form-urlencoded
Cela devrait être le moyen le plus courant de soumettre des données via POST. Pour le formulaire natif du navigateur, si l'attribut enctype n'est pas défini, les données seront finalement soumises en mode application/x-www-form-urlencoded. La requête est similaire à la suivante (les en-têtes de requête non pertinents sont omis dans cet article) :
Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
Premièrement, le Content-Type est spécifié comme application/x-www-form-urlencoded ; Les données sont codées selon key1=val1&key2=val2, et key et val sont tous deux transcodés en URL. La plupart des langages côté serveur prennent bien en charge cette méthode. Par exemple, en PHP, $_POST['title'] peut obtenir la valeur du titre et $_POST['sub'] peut obtenir le sous-tableau.
Souvent, nous utilisons également cette méthode lors de la soumission de données à l'aide d'Ajax. Par exemple, pour l'Ajax de jquery et QWrap, la valeur par défaut de Content-Type est "application/x-www-form-urlencoded;charset=utf-8".
multipart/form-data
Il s'agit d'une autre méthode courante de soumission de données POST. Lorsque nous utilisons un formulaire pour télécharger des fichiers, l'enctypage du formulaire doit être égal à cette valeur. Regardons directement un exemple de requête :
Content-Type:multipart/form-data; boundary=—-WebKitFormBoundaryrGKCBY7qhFd3TrwA ——WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name=”text” title——WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name=”file”; filename=”chrome.png”Content-Type: image/png PNG … content of chrome.png …——WebKitFormBoundaryrGKCBY7qhFd3TrwA–
Cet exemple est un peu plus compliqué. Tout d'abord, une limite est générée pour séparer les différents champs. Afin d'éviter la duplication avec le contenu du texte, la limite est très longue et compliquée. Ensuite, Content-Type spécifie que les données sont codées avec mutipart/form-data et quel est le contenu limite de cette requête. Le corps du message est divisé en plusieurs parties avec une structure similaire en fonction du nombre de champs. Chaque partie commence par –boundary, suivi des informations de description du contenu, suivies d'un retour chariot et enfin du contenu spécifique du champ (texte ou binaire). Si un fichier est transféré, incluez également le nom du fichier et les informations sur le type de fichier. Le corps du message se termine par le drapeau –boundary–. Pour une définition détaillée de mutipart/form-data, veuillez consulter la rfc1867.
Cette méthode est généralement utilisée pour télécharger des fichiers, et les principaux langages de serveur la prennent également en charge.
Les deux méthodes de données POST mentionnées ci-dessus sont nativement supportées par les navigateurs, et à ce stade, les formulaires natifs ne supportent que ces deux méthodes. Mais comme de plus en plus de sites Web, en particulier les WebApps, utilisent tous Ajax pour l'interaction des données, nous pouvons complètement définir de nouvelles méthodes de soumission de données pour apporter plus de commodité au développement.
application/json
application/json Ce Content-Type est certainement familier à tout le monde en tant qu'en-tête de réponse. En fait, de plus en plus de personnes l'utilisent désormais comme en-tête de requête pour indiquer au serveur que le corps du message est une chaîne JSON sérialisée. En raison de la popularité de la spécification JSON, tous les principaux navigateurs, à l'exception des versions inférieures d'IE, prennent en charge nativement JSON.stringify, et les langages côté serveur ont également des fonctions pour traiter JSON. Vous ne rencontrerez aucun problème lors de l'utilisation de JSON.
Il est également utile que le format JSON prenne en charge des données structurées beaucoup plus complexes que les paires clé-valeur. Je me souviens que lorsque je travaillais sur un projet il y a quelques années, les données à soumettre avaient un niveau très approfondi. J'ai sérialisé les données en JSON et je les ai soumises. Mais à ce moment-là, j'ai utilisé la chaîne JSON comme val, je l'ai toujours placée dans la paire clé-valeur et je l'ai soumise en mode x-www-form-urlencoded.
Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码: var data = {‘title':’test’, ‘sub’ : [1,2,3]};$http.post(url, data).success(function(result) { …});
La requête finale envoyée est :
Content-Type: application/json;charset=utf-8 {“title”:”test”,”sub”:[1,2,3]}
Cette solution peut facilement soumettre des données structurées complexes et est particulièrement adaptée aux interfaces RESTful. Les principaux outils de capture de paquets, tels que les outils de développement de Chrome, Firebug et Fiddler, afficheront les données JSON dans une arborescence très conviviale. Cependant, certains langages côté serveur ne prennent pas encore en charge cette méthode. Par exemple, php ne peut pas obtenir le contenu de la requête ci-dessus via l'objet $_POST. À ce stade, vous devez le gérer vous-même : lorsque le Content-Type dans l'en-tête de la requête est application/json, obtenez le flux d'entrée d'origine à partir de php://input, puis json_decodez-le dans un objet . Certains frameworks PHP ont déjà commencé à le faire.
当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章。
text/xml
我的博客之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
Content-Type: text/xml <!–?xml version=”1.0″?–><methodcall> <methodname>examples.getStateName</methodname> <params> <param> <value><i4>41</i4></value> </params></methodcall>
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!