PHP使用curl函数发送Post请求的注意事项


Posted in PHP onNovember 26, 2016

前言

前几天在工作中遇到了一个需求,当用户点击了某个按钮以后,后台发起一个post请求到我这里,我接受传递过来的数据。一开始同事是用公司框架公共封装的http_request()方法进行发送的,代码如下:

public function http_request( $url, $post = '', $timeout = 5 ){ 
 if( empty( $url ) ){
  return ;
 }
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 
 if( $post != '' && !empty( $post ) ){
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post)));
 }
 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 $result = curl_exec($ch);
 curl_close($ch);
 return $result;
 }

一开始我并没有留意传递过来的数据是application/json编码的json字符串,我在后台直接用接受application/x-www-form-urlencoded编码格式的数据方式来取传递过来的数据(就是直接用的$_POST方式获取的),结果当然没什么也没有取到了。后来,同事直接改了http_request()方法,直接传递application/x-www-form-urlencoded编码格式的数据过来,我这就没有做更改。

对于上面的问题,我一直纳闷当时为什么没有拿到传递过来的数据。

今天项目基本完工,研究了以下。

php中的curl()函数进行post请求的时候,传递数据的格式可以有以下几种方式:

(1):由参数拼接而成的key=>value键值对字符串。形如以下: name=xxx&age=23$sex=1

这种请求参数默认是按照application/x-www-form-urlencoded进行编码的。

(2):由参数组成的key=>value键值对数组(只能是一维数组,更高维度的数组会报错)。

形如以下格式:

[ name="xxx" , age = 23 , sex = 男 ]

这种请求参数默认是按照multipart/form-data格式进行编码的。

上面说了,curl()进行post请求的时候,只能传递一维数组作为传递的参数,那么如果想要传递多维数组需要怎么处理那?

有两种方式可以来处理,分别是下面的方式3以及方式4。

(3):将多维数组进行http_build_query()进行处理,等到一个key=>value键值对格式的字符串。

如下面所示:

$data = [
          "msg"=>"这是一条测试数据",
          "xxx" => "yyyy",
          "msg_data" => [
                          "name"=>"sunms",
                          "age"=>23,
                          "sex"=>"男",
                          "content"=>[
                                 1,2,3
                                ]
                       ],
       ];

将得到以下的字符串:

msg=这是一条测试数据&xxx=yyyy&msg_data[name]=sunms&msg_data[age]=23&msg_data[sex]=男&msg_data[content][0]=1&msg_data[content][1]=2&msg_data[content][2]=3

这种方式也是通过application/x-www-form-urlencoded进行编码的,在接收方可以通过$_POST直接获取。

(4):将多维数组转换为json格式的字符串,对字符串进行application/json格式编码,在接收方通过file_get_contents(“php://input”)或者$GLOBALS[‘HTTP_RAW_POST_DATA']的方式获取传递过来的json格式的字符串,然后将json格式的字符串转换为数组进行处理。

$data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               'Content-Type: application/json',
               'Content-Length: ' . strlen($data_string))
      );

注意:对于application/json格式编码的数据,$_POST是不能直接获取的,需要通过file_get_contents(“php://input”)或者$GLOBALS[‘HTTP_RAW_POST_DATA']的方式获取。

总结

以上就是关于PHP中的curl函数发送Post请求的注意点,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
PHP数据库开发知多少
Oct 09 PHP
基于mysql的论坛(6)
Oct 09 PHP
其他功能
Oct 09 PHP
php split汉字
Jun 05 PHP
phpize的深入理解
Jun 03 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 #PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 #PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 #PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 #PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 #PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 #PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 #PHP
You might like
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
vue中的provide/inject的学习使用
2018/05/09 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
Python数组遍历的简单实现方法小结
2016/04/27 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
Linux如何压缩可执行文件
2013/10/21 面试题
飘柔洗发水广告词
2014/03/14 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
优秀员工推荐材料
2014/12/20 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers