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中显示格式化的用户输入
Oct 09 PHP
PHP生成HTML静态页面实例代码
Aug 31 PHP
PHP中的Memcache详解
Apr 05 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 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
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
js控制frameSet示例
2013/09/10 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
Python读取stdin方法实例
2019/05/24 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python中base64与xml取值结合问题
2019/12/22 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
寒假思想汇报
2014/01/10 职场文书
教师师德反思材料
2014/02/15 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
学校周年庆活动方案
2014/08/22 职场文书
学校开学标语
2014/10/06 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python