我已经被指示使用方法php://input而不是$_POST时,与Ajax请求从JQuery交互。我不明白的是使用这个与$_POST或$_GET的全局方法的好处。
当前回答
if (strtoupper($_SERVER['REQUEST_METHOD']) != 'POST') {
throw new Exception('Only POST requests are allowed');
}
// Make sure Content-Type is application/json
$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if (stripos($content_type, 'application/json') === false) {
throw new Exception('Content-Type must be application/json');
}
// Read the input stream
$body = file_get_contents("php://input");
// Decode the JSON object
$object = json_decode($body, true);
其他回答
如果post数据格式不正确,$_POST将不包含任何内容。然而,php://input将会有畸形的字符串。
例如,有一些ajax应用程序,不形成正确的post键值序列上传文件,只是转储所有的文件作为post数据,没有变量名或任何东西。 $_POST为空,$_FILES也为空,php://input将包含精确的文件,写为字符串。
原因是php://input返回请求的HTTP-headers之后的所有原始数据,而不管内容类型是什么。
PHP的超全局变量$_POST,只能包装任意一种类型的数据
Application /x-www-form-urlencoded(简单表单帖子的标准内容类型)或 Multipart /form-data(主要用于文件上传)
这是因为这些是用户代理必须支持的唯一内容类型。因此,服务器和PHP传统上不期望接收任何其他内容类型(这并不意味着它们不能)。
所以,如果你只是简单地POST一个好的旧HTML表单,请求看起来像这样:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
但如果您经常使用Ajax,这可能还包括用类型(字符串、int、bool)和结构(数组、对象)交换更复杂的数据,因此在大多数情况下JSON是最佳选择。但是带有json有效负载的请求应该是这样的:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
内容现在是application/json(或者至少不是上面提到的任何一个),所以PHP的$ _post包装器还不知道如何处理它。
数据仍然在那里,只是不能通过包装器访问它。所以你需要自己用file_get_contents('php://input')获取原始格式(只要它不是multipart/form-data-encoded)。
这也是访问xml数据或任何其他非标准内容类型的方法。
if (strtoupper($_SERVER['REQUEST_METHOD']) != 'POST') {
throw new Exception('Only POST requests are allowed');
}
// Make sure Content-Type is application/json
$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if (stripos($content_type, 'application/json') === false) {
throw new Exception('Content-Type must be application/json');
}
// Read the input stream
$body = file_get_contents("php://input");
// Decode the JSON object
$object = json_decode($body, true);
php://input可以给你数据的原始字节。如果POST数据是JSON编码的结构,这是很有用的,AJAX POST请求通常是这种情况。
下面是一个函数:
/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
当处理表单中由传统POST提交的键值数据时,$_POST数组更有用。只有当post的数据是一种可识别的格式时,这才有效,通常是application/x-www-form-urlencoded(详情请参阅http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4)。
简单的例子如何使用它
<?php
if(!isset($_POST) || empty($_POST)) {
?>
<form name="form1" method="post" action="">
<input type="text" name="textfield"><br />
<input type="submit" name="Submit" value="submit">
</form>
<?php
} else {
$example = file_get_contents("php://input");
echo $example; }
?>
推荐文章
- 编写器更新和安装之间有什么区别?
- 我如何捕捉Ajax查询后错误?
- 本地机器上的PHP服务器?
- 如何评论laravel .env文件?
- 在PHP中检测移动设备的最简单方法
- 如何在树枝模板中呈现DateTime对象
- 如何删除查询字符串,只得到URL?
- 如何检测URL是否在JavaScript哈希后发生了变化
- 您是否可以“编译”PHP代码并上传一个二进制文件,该文件将由字节码解释器运行?
- 非法字符串偏移警告PHP
- 从数组中获取随机项
- 在输入数字中隐藏上下箭头按钮(旋转器)- Firefox 29
- 为什么一个函数检查字符串是否为空总是返回true?
- 如何使用Laravel迁移将时间戳列的默认值设置为当前时间戳?
- 如何增加php的最大执行时间