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 相关文章推荐
提问的智慧
Oct 09 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
使用php实现网站验证码功能【推荐】
Feb 09 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
Laravel实现ApiToken认证请求
Oct 14 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
德生PL550的电路分析
2021/03/02 无线电
Zend的AutoLoad机制介绍
2012/09/27 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
vue引用外部JS的两种种方法
2020/01/28 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python里对list中的整数求平均并排序
2014/09/12 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
详解Python sys.argv使用方法
2019/05/10 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
大学生如何写自荐信
2014/01/08 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
好学生评语大全
2014/05/05 职场文书
生物技术专业求职信
2014/06/10 职场文书
中国梦团日活动总结
2014/07/07 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL