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
基于数据库的在线人数,日访问量等统计
Oct 09 PHP
别人整理的服务器变量:$_SERVER
Oct 20 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
关于zend studio 出现乱码问题的总结
Jun 23 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
php实现文件上传基本验证
Mar 04 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
如何使用PHP获取网络上文件
2006/10/09 PHP
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php 动态添加记录
2009/03/10 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
python对象及面向对象技术详解
2016/07/19 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python3安装crypto出错及解决方法
2019/07/30 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
纠纷协议书
2014/04/16 职场文书
社会工作专业求职信
2014/07/15 职场文书
2014年库房工作总结
2014/11/26 职场文书
安阳殷墟导游词
2015/02/10 职场文书
超市采购员岗位职责
2015/04/07 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python