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 相关文章推荐
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
php 中英文语言转换类代码
Aug 11 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php实现比较全的数据库操作类
Jun 18 PHP
php抽象方法和抽象类实例分析
Dec 07 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
在Laravel5中正确设置文件权限的方法
May 22 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
php+js实现点赞功能的示例详解
Aug 07 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 gzip压缩输出的实现方法
2013/04/27 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
python日志记录模块实例及改进
2017/02/12 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
Python多继承顺序实例分析
2018/05/26 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
公司行政经理岗位职责
2013/12/24 职场文书
业务员的岗位职责
2014/03/15 职场文书
社区居务公开实施方案
2014/03/27 职场文书
社区服务活动总结
2014/05/07 职场文书
小学生安全责任书
2014/07/25 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
关于分班的感言
2015/08/04 职场文书
2016年寒假见闻
2015/10/10 职场文书
倡议书怎么写?
2019/04/11 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
分享python函数常见关键字
2022/04/26 Python