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开发入门教程之面向对象
Dec 05 PHP
PHP入门速成教程
Mar 19 PHP
中英文字符串翻转函数
Dec 09 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
PHP生成随机数的方法总结
Mar 01 PHP
Laravel用户授权系统的使用方法示例
Sep 16 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 array_flip() 删除数组重复元素
2009/01/14 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
初步讲解Python中的元组概念
2015/05/21 Python
pandas 选择某几列的方法
2018/07/03 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
如何用python 操作zookeeper
2020/12/28 Python
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
会计电算化个人自我评价
2013/11/17 职场文书
展会邀请函范文
2014/01/26 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL