php收不到参数的解决办法:1、修改发送端代码为“$data = array ('openid' => "123",'keyword' => "321");$data = json_encode($data);...”;2、修改接收端代码为“$obj=file_get_contents("php://input");$data=json_decode(...)”即可。

本教程操作环境:windows10系统、php8.1版、dell g3电脑
php收不到参数怎么办?
curl 提交参数 php接收不到的问题
具体问题描述:
用thinkphp写了一个接口。
在远端用curl去调用接口,curl的写法如下:
function c{
//初始化curl句柄
$curl = curl_init();
curl_setopt($curl, curlopt_url, $url);//设置请求的url
#curl_setopt($curl, curlopt_header, false);// 不要http header 加快效率
curl_setopt($curl, curlopt_returntransfer,1); //设为true把curl_exec()结果转化为字串,而不是直接输出
//ssl验证
curl_setopt($curl, curlopt_ssl_verifypeer, false); // https请求时要设置为false 不验证证书和hosts false 禁止 curl 验证对等证书(peer's certificate), 自curl 7.10开始默认为 true。从 curl 7.10开始默认绑定安装。
curl_setopt($curl, curlopt_ssl_verifyhost, false);//检查服务器ssl证书中是否存在一个公用名(common name)。
$header[] = "content-type:application/json;charset=utf-8";
if(!empty($header)){
curl_setopt ( $curl, curlopt_httpheader, $header );//设置 http 头字段的数组。格式: array('content-type: text/plain', 'content-length: 100')
}
//请求时间
$timeout = 30;
curl_setopt ($curl, curlopt_connecttimeout, $timeout);//设置连接等待时间
//不同请求方法的数据提交
switch ($method){
case "get" :
curl_setopt($curl, curlopt_httpget, true);//true 时会设置 http 的 method 为 get,由于默认是 get,所以只有 method 被修改时才需要这个选项。
break;
case "post":
if(is_array($params)){
$params = json_encode($params,320);
}
#curl_setopt($curl, curlopt_post,true);//true 时会发送 post 请求,类型为:application/x-www-form-urlencoded,是 html 表单提交时最常见的一种。
#curl_setopt($curl, curlopt_nobody, true);//true 时将不输出 body 部分。同时 mehtod 变成了 head。修改为 false 时不会变成 get。
curl_setopt($curl, curlopt_customrequest, "post");//http 请求时,使用自定义的 method 来代替"get"或"head"。对 "delete" 或者其他更隐蔽的 http 请求有用。 有效值如 "get","post","connect"等等;
//设置提交的信息
curl_setopt($curl, curlopt_postfields,$params);//全部数据使用http协议中的 "post" 操作来发送。
break;
case "put" :
curl_setopt ($curl, curlopt_customrequest, "put");
curl_setopt($curl, curlopt_postfields,json_encode($params,320));
break;
case "delete":
curl_setopt ($curl, curlopt_customrequest, "delete");
curl_setopt($curl, curlopt_postfields,$params);
break;
}
$data = curl_exec($curl);//执行预定义的curl
$status = curl_getinfo($curl, curlinfo_http_code);//获取http返回值,最后一个收到的http代码
curl_close($curl);//关闭curl会话
$res = json_decode($data,true);
return $res;
}发现一个问题,就是post提交时,后台无法接收到传来的参数。
后台接收:
public function getuserbyid(){
$custid = i("post.cust_uid");
$companyid = i("post.company_id");
$model = m('chatuser','snake_',$this->db);
$mine = $model->field('username,avatar,sign,id')->where(['id'=>$custid])->find();
$company = $model->field('username,avatar,sign,id')->where(['id'=>$companyid])->find();
$return['mine'] =$mine;
$return['company'] =$company;
$return['status'] = 1;
$this->ajaxreturn($return);
}各种调试后,发现header中的
$header[] = "content-type:application/json;charset=utf-8";
和
if(is_array($params)){
$params = json_encode($params,320);
}提交的是json型的数据,而用postman测试接口用body的form-data
急,只能先注释掉上面两个代码。正常提交。有时间了再看一下json的接收方法。
如果有知道的同学,希望留言解疑,将不胜感激!
正确解决方法的代码如下:
//发送端
$data = array (
'openid' => "123",
'keyword' => "321"
);
$data = json_encode($data);
...
curl_setopt($curl, curlopt_post, 1);
curl_setopt($curl, curlopt_postfields, $data);
//接受端
$obj = file_get_contents("php://input");
$data = json_decode($obj, true);
就这么愉快的撅腚了1