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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
PHP实现多服务器session共享之NFS共享的方法
Mar 16 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
Aug 31 PHP
php获取淘宝分类id示例
Jan 16 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
PHP调用其他文件中的类
Apr 02 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
PHP7移除的扩展和SAPI
Mar 09 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的中问验证码
2006/11/25 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
vue多次循环操作示例
2019/02/08 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python实现爬虫下载美女图片
2015/07/14 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
英语自我评价范文
2014/01/24 职场文书
对公司合理化的建议书
2014/03/12 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
交通文明倡议书
2014/05/16 职场文书
安全责任书怎么写
2014/07/28 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
小学教师节活动总结
2015/03/20 职场文书
大学生支教感言
2015/08/01 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
Python first-order-model实现让照片动起来
2022/06/25 Python
Nginx跨域问题解析与解决
2022/08/05 Servers