PHP中CURL的CURLOPT_POSTFIELDS参数使用细节


Posted in PHP onMarch 17, 2014

在通常情况下,我们使用 CURL 来提交 POST 数据的时候,我们已经习惯了这样的写法:

curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data);

但是这样的写法在有时候并不会很好用,可能会得到服务器返回的 500 错误。但是我们尝试在使用 Socket 方式向服务器提交数据的时候,我们会得到非常正确的结果。
例如我们在服务器上面存在一个如下的 PHP 文件:
<?php print_r($_SERVER);?>

当我们采用 CURL 在不注意细节的前提下向服务器发送一些数据,我们可能得到下面这样的结果,这不是我们理想中的结果:
[CONTENT_TYPE] => multipart/form-data; boundary=—————————-f924413ea122

但是如果我们在采用 http_build_query($post_data) 来替代 $post_data 再向这个 PHP 脚本提交数据的时候,我们就会得到和上面不同的结果,这才是我们理想中的结果:
[CONTENT_TYPE] => application/x-www-form-urlencoded

从上面这个例子中不难看出,使用 CURL 并且参数为数据时,向服务器提交数据的时候,HTTP头会发送Content_type: application/x-www-form-urlencoded。这个是正常的网页<form>提交表单时,浏览器发送的头部。而 multipart/form-data 我们知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。
官方的手册上是这样说的:
The full data to post in a HTTP “POST” operation. To post a file, prepend a filename with @ and use the full path. This can either be passed as a urlencoded string like ‘para1=val1¶2=val2&…' or as an array with the field name as key and field data as value. If value is an array, the Content-Type header will be set to multipart/form-data.

使用数组提供 post 数据时,CURL 组件大概是为了兼容 @filename 这种上传文件的写法,默认把 content_type 设为了 multipart/form-data。虽然对于大多数服务器并没有影响,但是还是有少部分服务器不兼容。
经过一番总结最终得出结论:在没有需要上传文件的情况下,尽量对 post 提交的数据进行 http_build_query 处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包。
PHP 相关文章推荐
php 变量未定义等错误的解决方法
Jan 12 PHP
PHP 第三节 变量介绍
Apr 28 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
php mysql数据库操作类(实例讲解)
Aug 06 PHP
Laravel实现定时任务的示例代码
Aug 10 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
Oct 11 PHP
phpQuery采集网页实现代码实例
Apr 02 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 PHP
PHP同时连接多个mysql数据库示例代码
Mar 17 #PHP
PHP的password_hash()使用实例
Mar 17 #PHP
PHP5各个版本的新功能和新特性总结
Mar 16 #PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 #PHP
19个超实用的PHP代码片段
Mar 14 #PHP
php的zip解压缩类pclzip使用示例
Mar 14 #PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 #PHP
You might like
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
房屋出租协议书范本(标准版)
2014/09/24 职场文书
公司庆典欢迎词
2015/01/26 职场文书
三八妇女节慰问信
2015/02/14 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
师范生小学见习总结
2015/06/23 职场文书
物业公司管理制度
2015/08/05 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
MySQL数据库事务的四大特性
2022/04/20 MySQL