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 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
PHP链表操作简单示例
Oct 15 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 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
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
常用的php对象类型判断
2008/08/27 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
使用python绘制二维图形示例
2019/11/22 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
护理专业应届毕业生推荐信
2013/11/15 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
公务员政审材料范文
2014/12/23 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
违纪学生保证书
2015/02/27 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
从原生JavaScript到React深入理解
2022/07/23 Javascript