Php http post方法是如何实现的?

Php http post方法是如何实现的?,php,http,post,Php,Http,Post,我想知道HTTP post方法背后发生了什么。 i、 e浏览器用PHP(例如)向服务器端脚本发送HTTP post请求 PHP的$u POST变量如何从客户端获取值 有人可以详细解释一下,或者指向一个指南。浏览器根据编码对数据进行编码,然后将其作为请求主体进行传输。PHP然后拿起它,用名称和值填充$\u POST(当名称包含字符[和]或)时,执行特殊处理)。我建议获得一个捕获代理(例如)或一个网络捕获工具(例如),并观察一下您自己的浏览流量;它会让你对这个问题有一个很好的看法 除此之外,POST

我想知道HTTP post方法背后发生了什么。 i、 e浏览器用PHP(例如)向服务器端脚本发送HTTP post请求

PHP的$u POST变量如何从客户端获取值


有人可以详细解释一下,或者指向一个指南。

浏览器根据编码对数据进行编码,然后将其作为请求主体进行传输。PHP然后拿起它,用名称和值填充
$\u POST
(当名称包含字符
[
]
)时,执行特殊处理)。

我建议获得一个捕获代理(例如)或一个网络捕获工具(例如),并观察一下您自己的浏览流量;它会让你对这个问题有一个很好的看法

除此之外,POST与GET非常相似,只是数据在请求体中而不是URL中发送,并且有两种编码方式(除了与GET共享的urlencode之外,还有多部分表单数据)

HTTP协议(*)指定浏览器应如何发送请求

HTTP基本上由一组纯文本标题组成,以换行符分隔,然后是正在传输的数据。在HTTP请求内部,POST数据的格式实际上与GET数据的格式几乎相同;它只是在HTTP头的不同部分

您可以使用或之类的工具来查看传入和传出HTTP请求的标题和数据的格式。实际上,阅读起来很简单,所以你只要看一下就可以算出答案

一旦到达服务器,PHP解释器就负责将原始HTTP请求数据转换为标准的$\u GET、$\u POST等变量。这是PHP为您所做的事情

其他语言(如Perl)没有内置此功能,因此Perl程序员必须在其程序中包含代码,以便将传入的请求数据解析为有用的变量。幸运的是,即使是Perl也有一个标准库,可以包含它来完成这项工作,因此即使是Perl程序员通常也不必再自己编写代码了

PHP和任何其他语言的处理方式都只是字符串操作。正如我所说的,HTTP数据是纯文本的,并且以简单的字符串格式接收,所以它只是一个通过在问号和等号字符上拆分来分解它的例子

由于PHP都是在幕后进行的,您可能不需要担心它使用的确切机制,但是如果您真的想知道的话,PHP源代码是可用的

我说的都是纯文本的。当然,HTTPS是加密的。然而,当PHP得到它的时候,Apache服务器已经完成了解密,所以就PHP而言,它仍然是纯文本


(*)在有人提醒我之前,是的,我知道说“HTTP协议”是一种冗余,就像“ATM机”或“PIN码”一样。

好吧,让我们一步一步来说明,从一个包含[form action=“foo.php”method=“post”的页面开始

单击提交(或按enter键)后,浏览器将触发一个名为“提交”的事件。可以在内部捕获此事件,以便使用javascript/dom进行处理,这是大多数站点为验证或Ajax例程所做的

如果例程没有停止流并返回false,浏览器将继续处理post请求(此过程与使用XMLHttpRequest对象进行post相同)

浏览器将首先检查方法、操作和内容编码,然后解析输入值以了解它将发送的数据的大小,并对其进行编码

最后,它发送如下内容(原始值):

这是一个POST请求。但请注意,它可以发送内容长度,并以块的形式发送变量。浏览器和服务器知道这可能发生(这是POST方法的目的)。当服务器收到POST请求时,它会一直侦听浏览器,直到收到的内容与通知的内容长度匹配

现在是另一边。服务器接收请求,侦听内容,解析它(foo=bar;xxx=baz),并在其环境中为该特定请求提供该请求,因此您可以使用PHP、Python或Java捕获该请求

就这样。注意,您可以在同一请求中传递GET和POST变量

使用[form action=“foo.php?someVar=123&anotherVar=TRUE”method=“post”]

将使浏览器按以下方式发送请求:

POST /foo.php?someVar=123&anotherVar=TRUE HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar
而服务器在解析此请求时将使以下变量可用:

  • 获取[someVar]=123
  • 获取[anotherVar]=TRUE
  • POST[foo]=bar

它将
转换为
(主要是出于历史原因;过去表单中的每个变量都转换为实变量。谷歌搜索“register\u globals”以了解最后一部分的详细信息)。至于冗余,那么“$\u GET,$\u POST variables”呢?最后我检查了一下,任何以$开头的单词都是一个变量(嘿,你自找的。)@cHao-hehe。是的,我想是的在浏览器中使用表单的方法很少,但是XHR POST可以(并且通常确实)使用JSON、XML等,而不是url编码或多部分/表单数据。当然,你通常需要阅读POST数据并自己解码。
POST /foo.php?someVar=123&anotherVar=TRUE HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar