WithCoderWithCoderWithCoder

Thinkphp3 接收不到post请求发送的json数据

    今天在使用Thinkphp3开发接口,在Postman模拟提交数据的时候,发现通过get方式提交的请求,通过 I() 方法可以取到请求的参数。而通过post方式提交的请求,通过 I() 方法和$_POST等,都取不到请求的参数。但是在正常的开发时,通过web页面提交的ajax和form请求,是可以通过 I() 方法正常取到请求参数的。

    首先,通过post方式传递的参数,使用的是 'Content-Type: application/json; charset=utf-8'。通过网络搜索,找到以下解决方案:

    由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/json的内容无法解析为$_POST数组,故保留原型,交给GLOBALS['HTTP_RAW_POST_DATA'] 来接收。

    php://input 允许读取 POST 的原始数据。和 $GLOBALS['HTTP_RAW_POST_DATA'] 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。不过 php://input 不能用于 enctype="multipart/form-data"。

    将接收Post参数的代码修改如下:

public function index()
{
    $reqData = json_decode(file_get_contents('php://input'), true);
    var_dump($reqData);
}

    再打印数据,通过结果可以看到,取到了通过Post提交的参数。

    1-200602112S0Z8.png

    不过,经过测试发现,上面的代码可以取到Post提交的参数,但是通过Get提交的参数是获取不到的。所以修改代码如下:   

public function index()
{
    $reqData =  $_SERVER['REQUEST_METHOD'] == 'GET' ? I() : json_decode(file_get_contents('php://input'), true);
    var_dump($reqData);
}

    这样,就可以同时通过Get或Post方式提交参数了

1-200602113111928.png

欢迎分享交流,转载请注明出处:WithCoder » Thinkphp3 接收不到post请求发送的json数据