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 相关文章推荐
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
Oct 29 PHP
PHP读取xml方法介绍
Jan 12 PHP
深入解析php中的foreach问题
Jun 30 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
php中文繁体和简体相互转换的方法
Mar 21 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
php文件上传你必须知道的几点
Oct 20 PHP
遍历echsop的region表形成缓存的程序实例代码
Nov 01 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
PHP内存溢出优化代码详解
Feb 26 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
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
php文件上传的简单实例
2013/10/19 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
实例讲解php实现多线程
2019/01/27 PHP
网页常用特效代码整理
2006/06/23 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
vue 组件简介
2020/07/31 Javascript
python中xrange用法分析
2015/04/15 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
如何卸载python插件
2020/07/08 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
2014年英语教学工作总结
2014/12/17 职场文书
企业承诺书格式范文
2015/04/28 职场文书
初二物理教学反思
2016/02/19 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
Python入门之使用pandas分析excel数据
2021/05/12 Python
python神经网络Xception模型
2022/05/06 Python