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);