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中$_SERVER的详细参数与说明
Jul 29 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
Feb 21 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
php快递单号查询接口使用示例
May 05 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 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
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
javascript 写类方式之二
2009/07/05 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
学习python类方法与对象方法
2016/03/15 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
python监控nginx端口和进程状态
2019/09/06 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
社会实践活动总结报告
2014/04/29 职场文书
交通志愿者活动总结
2014/06/27 职场文书
医学检验专业自荐信
2014/09/18 职场文书
2014年大学生工作总结
2014/11/20 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
HTML中的表单元素介绍
2022/02/28 HTML / CSS
mysql函数之截取字符串的实现
2022/08/14 MySQL