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实现的四则运算表达式计算实现代码
Aug 02 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
PHP错误和异长常处理总结
Mar 06 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
php实现的用户查询类实例
Jun 18 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
PHP封装的完整分页类示例
Aug 21 PHP
php的扩展写法总结
May 14 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
精通php的十大要点(上)
2009/02/04 PHP
php中var_export与var_dump的区别分析
2010/08/21 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
Python全局变量用法实例分析
2016/07/19 Python
python实现图片识别汽车功能
2018/11/30 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
面试后感谢信怎么写
2014/02/01 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书