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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP 批量删除 sql语句
Jun 05 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php ios推送(代码)
Jul 01 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
CI框架给视图添加动态数据
Dec 01 PHP
PHP session文件独占锁引起阻塞问题解决方法
May 12 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 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
js下函数般调用正则的方法附代码
2008/06/22 PHP
php数组去重复数据示例
2014/02/25 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
Numpy的简单用法小结
2019/08/28 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
企业文明单位申报材料
2014/05/16 职场文书
销售代理协议书
2014/09/30 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
python常见的占位符总结及用法
2021/07/02 Python