php接受post的json数据

本文探讨了PHP在处理非标准数据类型时的问题,特别是对于非application/x-www.form-urlencoded类型的数据,如text/xml、soap等,如何通过使用$HTTP_RAW_POST_DATA和php://input来正确接收和处理这些数据。并通过实例展示了如何在前端发送不同类型的数据并成功在PHP中获取。
最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post给了PHP,这什么情况?
突然想到了以前接触过flash将图片二进制流传给php,灵机一动用$GLOBALS['HTTP_RAW_POST_DATA']获取到了。于是就深入的查了一下,原来PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml或者 soap 或者 application/octet-stream之类的内容无法解析,如果用$_POST数组来接收就会失败!故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA']来接收。

php的HTTP_RAW_POST_DATA
用Content-Type=text/xml类型,提交一个xml文档内容给了php server,要怎么获得这个POST数据。
The RAW/ uninterpreted HTTP POST information can be accessed with:$GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where thepost Content-Type is not something PHP understands (such astext/xml).
由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA']来接收。
另外还有一项php://input 也可以实现此这个功能
php://input允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的php.ini 设置。php://input 不能用于enctype="multipart/form-data"。

应用
a.htm代码如下:
<formaction="post.php" method="post">
<inputtype="text" name="user">
<inputtype="password" name="password">
<inputtype="submit">
</form>

post.php代码如下:
<?echo file_get_contents("php://input");?>

客户端post json数据可以用curl方法!

### PHP接收POST请求中的JSON参数 在PHP中,当接收到一个`POST`请求且该请求的`Content-Type`为`application/json`时,无法直接通过`$_POST`数组获取数据。这是因为PHP不会自动解析`application/json`类型的请求体并将其填充到`$_POST`中[^2]。相反,需要手动从`php://input`流中读取原始请求数据,并将其解码为关联数组。 以下是一个完整的实现示例: ```php <?php // 从php://input读取原始请求数据 $json = file_get_contents("php://input"); // 将JSON字符串解码为关联数组 $data = json_decode($json, true); // 检查是否成功解码 if (json_last_error() === JSON_ERROR_NONE) { // 输出解码后的数据 echo "Received ID: " . $data['id'] . "\n"; // 假设JSON包含一个名为'id'的键 } else { // 如果解码失败,返回错误信息 http_response_code(400); // 设置HTTP状态码为400 Bad Request echo "Invalid JSON data"; } ?> ``` 上述代码片段展示了如何通过`file_get_contents("php://input")`读取请求体中的JSON数据,并使用`json_decode`将其转换为PHP可以处理的关联数组[^1]。如果JSON格式不正确,可以通过`json_last_error()`检查错误并返回适当的响应。 --- #### 注意事项 - 确保服务器端脚本能够正确处理非标准的`Content-Type`头。例如,当客户端发送`application/json`类型的数据时,PHP不会自动解析这些数据[^2]。 - 在生产环境中,建议对输入数据进行严格的验证和清理,以防止潜在的安全风险,如SQL注入或跨站脚本攻击(XSS)。 - 如果需要返回JSON格式的响应,可以使用`json_encode`将PHP变量转换为JSON字符串,并设置正确的响应头: ```php <?php header('Content-Type: application/json'); $response = ['status' => 'success', 'message' => 'Data received']; echo json_encode($response); ?> ``` --- #### 示例场景 假设客户端发送以下JSON数据: ```json { "id": 123, "name": "Example" } ``` 服务器端脚本将读取并解析此JSON数据,提取出`id`字段的值并输出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anssummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值