我知道想知道HTTP post方法背后会发生什么。 即浏览器向PHP中的服务器端脚本发送HTTP post请求(例如)。
PHP的$ _POST变量如何从客户端获取值。
有人可以详细解释或指向指南。
答案 0 :(得分:4)
HTTP协议(*)指定浏览器应如何发送请求。
HTTP基本上由一组明文标题组成,由换行符分隔,然后是传输的数据。在HTTP请求中,POST数据的实际格式与GET数据几乎相同;它只是在HTTP标头的不同部分。
您可以使用Firebug或Fiddler等工具来确切了解传入和传出HTTP请求的标头和数据的格式。实际上阅读起来非常简单,所以你应该能够通过查看来解决这个问题。
一旦到达服务器,PHP解释器负责将原始HTTP请求数据转换为其标准的$ _GET,$ _POST等变量。这是PHP为您所做的事情。
其他语言(例如Perl)没有内置此功能,因此Perl程序员必须在其程序中使用代码将传入的请求数据解析为有用的变量。幸运的是,即使Perl有一个可以包含的标准库来完成这项工作,所以即使Perl程序员通常也不必自己编写代码。
PHP和任何其他语言的方式只是字符串操作。正如我所说,HTTP数据是纯文本,并以简单的字符串格式接收,因此只需将其分解为问号和等号字符即可将其分解。
由于PHP在幕后完成所有工作,您可能不需要担心它使用的确切机制,但如果您真的想知道,PHP源代码是可用的。
我说这一切都是纯文本。当然,HTTPS是加密的。但是当PHP掌握它时,Apache服务器已经完成了解密,因此就PHP而言,它仍然是纯文本。
(*)在有人拉我之前,是的,我知道说“HTTP协议”是一种冗余,比如“ATM机”或“PIN号”。
答案 1 :(得分:1)
浏览器根据content-type of the form对数据进行编码,然后将其作为POST请求的正文进行传输。然后PHP选择它并使用名称和值填充$_POST
(当名称包含字符[
和]
或.
时执行特殊处理。)
答案 2 :(得分:0)
我建议获取捕获代理(例如Fiddler)或网络捕获工具(例如Wireshark)并观看您自己的浏览流量一段时间;它会让你对这个问题有一个很好的看法。
除此之外,POST与GET非常相似,只是数据是在请求的主体而不是URL中发送的,并且有两种方式对它们进行编码(除了urlencode之外还有多部分表单数据)这是与GET分享的)
答案 3 :(得分:0)
好吧,让我们一步一步地说明,从包含[form action =“foo.php”method =“post”]的页面开始
点击“提交”(或按Enter键)后,浏览器将触发名为“提交”的事件。可以在内部捕获此事件以使用javascript / dom进行处理,这是大多数站点为验证或Ajax例程所做的事情。
如果例程没有以false返回false停止流,则浏览器继续处理post请求(此过程与使用XMLHttpRequest对象发布帖子相同)。
浏览器将检查第一个方法,操作和内容编码,然后解析输入值以了解它将发送的数据的大小,并对其进行编码。
最后发送这样的内容(原始值):
POST /foo.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
这是一个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
解析此请求时服务器将使以下变量可用: