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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
定义php常量的详解
Jun 09 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 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开发中常用的字符串操作函数
2011/02/08 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
javascript事件模型代码
2007/07/01 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
python3中bytes和string之间的互相转换
2017/02/09 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
python如何安装下载后的模块
2020/07/03 Python
简单的Python人脸识别系统
2020/07/14 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
奇怪的鱼:Weird Fish
2018/03/18 全球购物
应届毕业生自我评价分享
2013/12/15 职场文书
办理居住证介绍信
2014/01/15 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
护士个人自我鉴定
2014/03/24 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
进行数据处理的6个 Python 代码块分享
2022/04/06 Python