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 05 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
PHP修改session_id示例代码
Jan 08 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
详解PHP实现执行定时任务
Dec 21 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 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中多维数组的foreach遍历示例
2014/06/13 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
jquery移动节点实例
2015/01/14 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
python常规方法实现数组的全排列
2015/03/17 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
python实现简单购物商城
2016/05/21 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
wxPython实现绘图小例子
2019/11/19 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
django 模型字段设置默认值代码
2020/07/15 Python
一文读懂Python 枚举
2020/08/25 Python
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
党员先进事迹材料
2014/12/19 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
浅谈Python数学建模之固定费用问题
2021/06/23 Python
如何利用Python实现一个论文降重工具
2021/07/09 Python
MySQL创建管理子分区
2022/04/13 MySQL