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+MYSQL的文章管理系统(一)
Oct 09 PHP
针对初学PHP者的疑难问答(1)
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php目录遍历函数opendir用法实例
Nov 20 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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 获取mysql数据库信息代码
2009/03/12 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
django框架如何集成celery进行开发
2017/05/24 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
教师师德承诺书
2014/03/26 职场文书
药店促销活动总结
2014/07/10 职场文书
新店开张活动方案
2014/08/24 职场文书
房屋维修申请报告
2015/05/18 职场文书
预备党员入党感言
2015/08/01 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python