file_get_contents('php://input') 和POST的区别
程序员文章站
2022-04-11 08:29:00
之前记得写过这2者的区别,今天看群里有个朋友也提出了怪异的问题,说是“file_get_contents('php://input')获取不到curl post请求的数据的问题”?其实这并不是所谓的"怪异",理解2者的区别其实就明白原因啦,好,直接举个例子吧,2个文件:1:发送数据的文件,如下: < ......
之前记得写过这2者的区别,今天看群里有个朋友也提出了怪异的问题,说是“file_get_contents('php://input')获取不到curl post请求的数据的问题”?
其实这并不是所谓的"怪异",理解2者的区别其实就明白原因啦,好,直接举个例子吧,2个文件:
1:发送数据的文件,如下:
<?php $ch = curl_init(); $data = ['username' => '周伯通', 'password' => '123456','sign'=>'asdfg123456']; $url = 'http://xxx.com/fpost.php';//fpost.php是接受数据的文件,代码在下面 $ch = curl_init(); //初始化curl curl_setopt($ch, curlopt_url, $url);//设置链接 curl_setopt($ch, curlopt_returntransfer, 1);//设置是否返回信息 curl_setopt($ch, curlopt_post, 1);//设置为post方式 curl_setopt($ch, curlopt_postfields, $data);//post数据 curl_setopt($ch, curlopt_useragent, "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1; .net clr 1.1.4322; .net clr 2.0.50727)"); $response = curl_exec($ch);//接收返回信息 if(curl_errno($ch)){//出错则显示错误信息 print curl_error($ch); } curl_close($ch); //关闭curl链接 echo $response;//显示返回信息
2:接受数据的文件,如下:
<?php $res = file_get_contents('php://input'); var_dump('file_get_contents 数据是:'.$res); echo'<br> post 数据是:'; var_dump($_post);
运行后我们会发现:file_get_contents('php://input')
不能接收curl post过来的数组。
解释:
如果post的原始数据是一维数组或&拼接的标准格式的键值对字符串,那么可以用$_post
来获取。
如果要通过file_get_contents获取,这种情况下可以发送json字符串,用json_encode
转一下,或者使用http_build_query:比如上面修改如下:
curl_setopt($ch, curlopt_postfields, http_build_query($data));//post数据
结果:
string(97) "file_get_contents 数据是:username=%e5%91%a8%e4%bc%af%e9%80%9a&password=123456&sign=asdfg123456" post 数据是:array(3) { ["username"]=> string(9) "周伯通" ["password"]=> string(6) "123456" ["sign"]=> string(11) "asdfg123456" }
所以大家在使用中,注意下传参的方式即可解决问题。无非就这2种比较常用的数据传参方式啦。