HTTP 协议中的 POST 方法有多中格式的数据协议, 在 HTTP 的 head 中用不同的 Content-type 标识. 常用的有
- application/x-www-form-urlencoded, 这是最常见的, 就是 from 表单的格式. 在 HTTP 的 head 中是 Content-Type: application/x-www-form-urlencoded.
- multipart/form-data, 这个是用来上传文件的, 在 HTTP 的 head 中是 Content-Type: multipart/form-data; boundary=----webKitFormBoundary7MA4YWxkTrZu0gW
Raw 这个不是特别常用, 传输的数据在 HTTP 的 body 中只有一段, 不是以键值对的形式存放. 在 HTTP 的 head 中是 Content-Type: application/JSON,Content-Type: text,Content-Type: application/xml,Content-Type: text/xml, 等等形式
对于 Content-Type: application/x-www-form-urlencoded 这种 form 表单的数据, 在 PHP 中, 使用 $_POST['name'] 可以直接获取, 没有什么特别的
Content-Type: multipart/form-data; 这种格式的数据, 在 PHP 中使用 $_POST['name'] 可以获取字符数据, 使用 $_FILES['file'] 可以获取.
对于 Raw 这种格式的数据, 使用以上两种办法没有办法获取到, 需要使用别的手段.
1. 使用 file_get_contents("php://input") 获取; 写一个简单 PHP 文件测试一下
- <?PHP
- $test=file_get_contents("php://input");
- echo $test;
用 postman 测试一下
没问题, 可以接收到
2. 使用 $GLOBALS['HTTP_RAW_POST_DATA'] 接收
- <?PHP
- $test=$GLOBALS['HTTP_RAW_POST_DATA'];
- echo $test;
用 postman 测试一下
卧槽, 竟然出错了, 提示没有发现 HTTP_RAW_POST_DATA 这个数组索引, 什么鬼. Google 一番, 在 PHP 的官网看到了这样一段话
原来 HTTP_RAW_POST_DATA 这个在 php5.6 中已经被废弃了, 在 php7.0 以后的版本中已经被删除了, 我用的 PHP 版本为 7.2, 肯定就出错了
好吧, 那就老老实实的用 file_get_contents("php://input") 获取吧
在实际开发中, 一般都是使用框架的, 我用 ThinkPHP 用比较多, 在 tp5.0 中可以使用 Request 的 getInput() 函数获取 Raw 中的数据
- <?PHP
- namespace App\index\controller;
- use think\Request;
- class Index
- {
- public function index(Request $request)
- {
- echo $request->getInput();
- }
- }
测试一下
没有问题, 可以正常获取
关于 PHP 获取 HTTP POST 数据的方法先介绍到这里
来源: https://yq.aliyun.com/articles/687950