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 fread()使用技巧
Jan 22 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
php实现字符串反转输出的方法
Mar 14 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 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
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
JavaScript window.location对象
2014/11/14 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
jQuery 选择器详解
2015/01/19 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
python join方法使用详解
2019/07/30 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
六十大寿答谢词
2014/01/12 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
消防验收申请报告
2015/05/15 职场文书
六一儿童节致辞
2015/07/31 职场文书
检讨书之工作不认真
2019/08/14 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
SpringBoot快速入门详解
2021/07/21 Java/Android
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技