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 相关文章推荐
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
PHP 分页类(模仿google)-面试题目解答
Sep 13 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php创建sprite
2014/02/11 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
React实现todolist功能
2020/12/28 Javascript
python使用htmllib分析网页内容的方法
2015/05/08 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
如何手工释放资源
2013/12/15 面试题
大四自我鉴定范文
2013/10/06 职场文书
初中三年学生的学习自我评价
2013/11/13 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
老师对学生的寄语
2014/04/09 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
总结几个非常实用的Python库
2021/06/26 Python