了解XMLHttpRequest如何将数据发送到服务器

时间:2013-10-31 15:38:15

标签: php http post http-headers xmlhttprequest

我无法完全理解向服务器的数据传输。我有哪些方式?当我开始学习PHP时,我认为有两种方法叫GET加密URL中的数据,POST以另一种方式将数据发送到服务器。但我并不知道究竟在哪里。

现在我想了解RESTful服务器后端,我了解到GETPOST只是请求方法,其中包括PUTDELETE。似乎与如何将数据传输与服务器有关。

此外,我读到可以在HTTP标头中发送其他数据。这是POST实际发送数据的方式还是存在差异?

无论使用PHP的$_POST数组的请求方法,我都想读取POST数据,但这不起作用。另一方面,当我尝试从php://input手动解析标头信息时,我看不到POST数据。有人可以向我解释在不同情况下传输数据的位置吗?

我的目标是从客户端获取参数,而不管内容类型是什么,可能是form-datajson或其他内容,以及请求方法。我怎么能用PHP做到这一点?请求将使用JQuery的AJAX功能发送。

1 个答案:

答案 0 :(得分:1)

解释http如何使用nc工作 http://linux.die.net/man/1/nc

获取

$ nc -l 8888启动虚拟服务器,听听8888

使用jQuery(通过XHR impl)发送GET请求

$.get("http://localhost:8888", { a :1 ,b: 2})

nc将打印XHR发送到服务器的内容到stdout

$nc -l 8888
GET /?a=1&b=2&_=1383234919249 HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept: */*
Origin: http://stackoverflow.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
DNT: 1
Referer: http://stackoverflow.com/questions/19710815/understanding-how-xmlhttprequest-sends-data-to-a-server
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4

因此,PHP将GET /?a=1&b=2&_=1383234919249解析为$_GET

发表

使用nc录制POST

POST / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Content-Length: 7
Accept: */*
Origin: http://stackoverflow.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
DNT: 1
Referer: http://stackoverflow.com/questions/19710815/understanding-how-xmlhttprequest-sends-data-to-a-server
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4

a=1&b=2

在这里你可以看到Content-Type: application/x-www-form-urlencoded ,告诉浏览器发送的http正文是表格编码的

因此,PHP将a=1&b=2解析为数组$_POST

为什么php://input看不到POST BODY

根据http://php.net/manual/en/wrappers.php.php

php://input是一个流,只能读取一次

以下是来自php doc

  

注意:使用php://输入打开的流只能读取一次;该   流不支持搜索操作。但是,取决于   SAPI实现,有可能打开另一个php://输入   流并重新开始阅读。这只有在请求正文时才有可能   数据已保存。通常,这是POST请求的情况,   但不是其他请求方法,例如PUT或PROPFIND。