分类
php

服务端接收不到post数据怎么办?

问题如上,我用php的curl来简单模仿请求接口。直接上代码吧

请求端代码 client.php
<?php
$url = 'http://test.com/client.php';
$data = ''; //测试数据,分别根据以下三种情况进行设置
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_exec($ch);
curl_close($ch);

测试情况一:post数据为数组
$data = array(‘hello world’);
测试情况二:post 数据为json数据
$data = json_encode(array(‘hello world’));
测试情况三:post 数据为字符串
$data = ‘hello world’;

接口端的代码 getinfo.php
<?php
$data = $_POST; //php预定义的变量获取http post数据
var_dump($data);
$data =file_get_contents("php://input");//获取请求的数据流
var_dump($data);
$data = getallheaders();s //获取客户端的请求头信息
var_dump();

根据在client设置的三种不同的post数据在服务端的打印结果
情况一(数据为array):
$_POST:array(“hello world” )
php://input: “”
请求头: “Content-Type”=”multipart/form-data” (简化输出)

情况二(数据为json):
$_POST:array(0) { }
php://input:string(17) “[“hello world”]”
请求头:”Content-Type”= “application/x-www-form-urlencoded”(简化输出)

情况三(数据为string):
$_POST:array(1) { [“hello world”]=> string(0) “” }
php://input: string(16) “hello world”
请求头:”Content-Type”= “application/x-www-form-urlencoded” (简化输出)

总结:
1.当客户端请求头没有特别设置时:
请求数据为数组array:则服务端使用$_POST 接收
请求数据为json: 则服务端使用php://input 接收
请求数据为string:则服务端建议使用php://input 接收
2.当设置客户端的请求头content-type(结论参考php官方文档)
官方文档:
$_POST描述:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本即。
php://input 描述 : enctype=”multipart/form-data” 的时候 php://input 是无效的。
其他补充:
php://input:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 application/json时,php://input是可以接收的

发表评论

电子邮件地址不会被公开。 必填项已用*标注