在阅读答案here之后,我有这个问题,有什么区别?
是否可以使用html提交原始POST?
答案 0 :(得分:24)
我们可以在三种情况下分割表单提交:
application/x-www-form-urlencoded
multipart/form-data
在案例1和案例3中,$HTTP_RAW_POST_DATA
包含原始发布数据(always_populate_raw_post_data
选项设置为false
除外,在这种情况下$HTTP_RAW_POST_DATA
为空情况1),即与客户端(通常是浏览器)发送的数据完全相同的数据。在1的情况下,数据具有诸如
key1=value1&key2=value2&key3[]=value3.1&key3[]=value3.2
PHP会自动解析此问题,以便$_POST
成为:
$_POST = array(
"key1" => "value1",
"key2" => "value2",
"key3" => array("value3.1", "value3.2");
)
原始数据的内容也可以通过php://input
进行访问,即使在always_populate_raw_post_data
设置为false
的情况下也是如此。特别是,file_get_contents("php://input")
会提供$HTTP_RAW_POST_DATA
已有或将要拥有的相同数据。
在案例3中,POST数据是任意的,$_POST
将是一个空数组,并且将始终填充$HTTP_RAW_POST_DATA
。
案例2是一个特殊的案例。在这种情况下,PHP将解析数据,$_POST
将获取未上传文件的字段的内容,但php://input
和$HTTP_RAW_POST_DATA
将不可用。
答案 1 :(得分:5)
$HTTP_RAW_POST_DATA
将包含以下内容:
beans=cheese&spam=eggs&one=two
PHP会为你拆分它,然后把它推到$_POST
数组中。天真地,它做了这样的事情:
$parts = explode('&', $HTTP_RAW_POST_DATA);
foreach ( $parts as $part ) {
list($key, $value) = explode('=', $part, 2);
$_POST[$key] = $value;
}
使用可嵌入HTML的JavaScript,您可以使用AJAX发布任何您喜欢的内容。像这样:
var req = new XMLHttpRequest();
req.open('POST', 'http://www.example.com/my_url' true);
req.send('any data you want');
允许您将任意内容发布到Web服务器。
答案 2 :(得分:0)
_POST
假定它是application/x-www-form-urlencoded
或multipart/form-data
表单值。 HTTP_RAW_POST_DATA
,如果已填充,则为原始字符串。您也可以使用psuedo-url php://input
访问它。您可以使用AJAX提交任意POST数据(例如XML,JSON,HTML)。
答案 3 :(得分:0)
$ _ POST是传入POST参数的关联数组。 PHP从原始HTTP帖子中为您创建了这个。如果您想自己处理原始POST数据(可能在POST中发送了一些二进制数据),请使用$ HTTP_RAW_POST_DATA。