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部分常见问题总结
Oct 09 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
深入了解PHP类Class的概念
Jun 14 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php使用post数组的键值创建同名变量并赋值的方法
Apr 03 PHP
php 获取文件行数的方法总结
Oct 11 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
php生成二维码图片方法汇总
Dec 17 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
Yii 框架使用Forms操作详解
May 18 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基于数组实现的分页函数实例
2014/08/20 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
node.js基础知识小结
2018/02/26 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python批量修改文件编码格式的方法
2018/05/31 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
python有几个版本
2020/06/17 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
盛大笔试题
2016/11/05 面试题
自我鉴定思想方面
2013/10/07 职场文书
副总经理任命书
2014/06/05 职场文书
运动会加油口号
2014/06/07 职场文书
中文专业求职信
2014/06/20 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
小学教代会开幕词
2016/03/04 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫