四种广泛的POST提交内容方式版权声明

原创
小哥 3年前 (2022-10-27) 阅读数 170 #PHP
文章标签 PHP

HTTP/1.1 协议 规定的 HTTP 请求方法具有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。哪里 POST 它通常用于向服务器提交数据,本文重点介绍 POST 提交数据的几种方式。

我们知道,HTTP 协议是以 ASCII 代码传输,建立于 TCP/IP 协议上的应用层规范。规范付诸行动 HTTP 请求分为三个部分:状态行请求行、请求头和消息正文。类似于以下内容:

BASH<method> <request-URL> <version> <headers> <entity-body>

协议规定 POST 提交的数据必须放在邮件正文中(entity-body但该协议没有具体说明数据必须使用什么编码方法。事实上,开发人员可以自己决定消息体的格式,只要最后发送 HTTP 申请符合上述格式。

然而,如果数据被发送出去,只有服务器端分析成功才有意义。通用服务器端语言,如 php、python 等,以及他们的 framework,是内置的,可以自动解析常见的数据格式。服务器端通常基于请求头(headers)中的 Content-Type 字段以了解请求中的消息体是如何编码的,然后分析该消息体。所以说 POST 提交数据方案,包括 Content-Type 和消息正文编码。以下是对它们的正式介绍。

application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式。浏览器的本机

表格(如果未设置) enctype 属性,然后最终使用 application/x-www-form-urlencoded 提交数据的方式。该请求类似于以下内容(本文省略了不相关的请求头):

BASHPOST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定为 application/x-www-form-urlencoded;第二,提交的数据如下 key1=val1&key2=val2 编码的方式,key 和 val 都进行了 URL 代码转换。大多数服务器端语言都很好地支持这种方法。例如 PHP 中,$_POST[title] 可以获得 title 的值,$_POST[sub] 可以得到 sub 数组。

很多时候,我们使用 Ajax 这在提交数据时也会用到。例如 JQueryQWrap 的 Ajax,Content-Type 缺省值为“application/x-www-form-urlencoded;charset=utf-8」。

multipart/form-data

这又是一种常见的 POST 提交数据的方式。当我们使用表单上传文件时,我们必须让 表单的 enctype 等于 multipart/form-data。让我们直接来看一个请求示例:

BASHPOST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="text" title ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

这个例子稍微复杂一些。第一个a boundary 用于拆分不同的字段,以避免与正文内容重复,boundary 漫长而复杂。然后 Content-Type 数据如中所示 multipart/form-data 要进行编码,请执行此请求。 boundary 这是什么。消息体根据字段的数量被分为几个结构相似的部分,每个部分都基于 --boundary 开始,然后是内容描述信息,然后是回车符,最后是特定于字段的内容(文本或二进制)。如果要传输文件,还应包括文件名和文件类型信息。消息正文结束 --boundary-- 马克·埃德。关于 multipart/form-data 有关详细定义,请访问 rfc1867 查看。

这种方法一般用于上传文件,各大服务器语言也都有很好的支持。

上面提到的两个 POST 数据的方式是浏览器原生支持的,标准最初诞生于这个阶段。 表单也 仅支持这两种方式 (通过 元素的 enctype 该属性指定默认为 application/x-www-form-urlencoded 。其实 enctype 还支持 text/plain ,但使用很少)。

随着越来越多的 Web 网站,尤其是 WebApp,全部使用 Ajax 在数据交互后,我们可以定义新的数据提交方法,为开发带来更多便利。

application/json

application/json 这个 Content-Type 作为一名应对负责人,大家当然都很熟悉。事实上,现在越来越多的人将其用作请求标头,以告知服务器消息正文已序列化。 JSON 弦乐。到期 JSON 规范的受欢迎程度,但较低版本除外。 IE 本机支持外部的所有主要浏览器。 JSON.stringify、服务器端语言也会被处理 JSON 函数,使用 JSON 不会有麻烦的。

JSON 它还有助于格式支持比键-值对复杂得多的结构化数据。我记得几年前我做一个项目的时候,我需要提交的数据水平非常深。我只是把数据 JSON 序列化后提交。但当时我正在把 JSON 细绳 val,仍放在键-值对中 x-www-form-urlencoded 投降的方式。

Google 的 AngularJS 中的 Ajax 函数,则默认为提交 JSON 弦乐。例如,以下代码:

JSvar data = {title:test, sub : [1,2,3]}; $http.post(url, data).success(function(result) { ... });

发送的最后一个请求是:

BASHPOST http://www.example.com HTTP/1.1 Content-Type: application/json;charset=utf-8 {"title":"test","sub":[1,2,3]}

该方案可以方便地提交复杂的结构化数据,特别适合 RESTful 界面。主要的抓包工具包括 Chrome 附带开发人员工具,Firebug、Fiddler,将以树形结构显示。 JSON 数据,非常友好。但是,也有一些服务器端语言还不支持这种方法,例如 php 不能通过 $_POST 该对象从上面的请求中获取内容。此时,您需要自己处理它:在请求头中 Content-Type 为 application/json 时,从 php://input 获取原始输入流,然后 json_decode 变成了一个物体。一些 php 该框架已经开始这样做了。

当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 提交数据的方式。如有需要,请参阅 这篇文章

text/xml

在我的博客之前 提到过 XML-RPC (XML Remote Procedure Call)。这是一种用途 HTTP 作为传输协议,XML 作为编码方法的远程调用规范。典型 XML-RPC 要求是这样的:

HTMLPOST http://www.example.com HTTP/1.1 Content-Type: text/xml <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>

XML-RPC 该协议简单,功能充足,可以用多种语言实现。它也被广泛使用,比如 WordPress 的 XML-RPC Api ,搜索引擎的 ping 服务 等等。JavaScript 中,也有 现成的库 支持以这种方式进行数据交互,可以很好地支持现有的 XML-RPC 服务。但是我个人觉得, XML 结构仍然过于臃肿,一般情况下使用 JSON 将会更加灵活和方便。

指向本文的链接: https://imququ.com/post/four-ways-to-post-data-in-http.html参与评论 »

--EOF--

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除