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 相关文章推荐
Discuz 模板引擎的封装类代码
Jul 18 PHP
php 输出双引号"与单引号'的方法
May 09 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
ThinkPHP安装和设置
Jul 27 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 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+JS实现搜索自动提示(实例)
2013/06/09 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
python如何在终端里面显示一张图片
2016/08/17 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python实现的栈(Stack)
2018/01/26 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
求职信模版
2013/11/30 职场文书
消防器材管理制度
2014/01/28 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
音乐幼师求职信
2014/07/09 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server