PHP中CURL的CURLOPT_POSTFIELDS参数使用细节

2014-08-14  来源:本站原创  分类:php技巧  人气:1 

CURL确实是一个不错的好工具,不仅在PHP中还是其他的操作系统中,都是一个非常好用的。但是如果你有些参数没有用好的话,那可能会得不到自己理想中的结果

在通常情况下,我们使用 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&para2=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中CURL的CURLOPT_POSTFIELDS参数使用细节 2014-08-14

    CURL确实是一个不错的好工具,不仅在PHP中还是其他的操作系统中,都是一个非常好用的.但是如果你有些参数没有用好的话,那可能会得不到自己理想中的结果 在通常情况下,我们使用 CURL 来提交 POST 数据的时候,我们已经习惯了这样的写法: curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data); 但是这样的写法在有时候并不会很好用,可能会得到服务器返回的 500 错误.但是我们尝试在使用 Socket 方式向服务器提交数据的时候,我们会得到非常正确的

  • PHP中CURL方法curl_setopt()函数的参数分享 2014-05-13

    PHP中CURL方法curl_setopt()函数的使用介绍,需要深入了解curl_setopt的朋友可以参考下 PHP CURL curl_setopt 参数 bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置,value是这个选项给定的值. 下列选项的值将被作为长整形使用(在option参数中指定): CURLOPT_INFILESIZE : 当

  • php中curl使用指南 2015-03-28

    这篇文章主要介绍了php中curl使用指南,十分详细,需要的朋友可以参考下 许多同学在第一次使用curl的时候感觉一个头两个大(包括我在内),看着这一条条的curl_setopt函数完全摸不着头脑,不过在你花10分钟看了我的介绍后相信你以后也能轻松戏耍php的curl了 首先,请看一个curl代码(花10秒钟,略看一遍,然后跳到后文) <?php $data = "<soap:Envelope>[...]</soap:Envelope>"; $tuCurl

  • PHP中CURL的几个经典应用实例 2014-01-26

    这篇文章主要介绍了PHP中CURL的几个经典应用实例,本文讲解了cURL请求的基本步骤.在cURL中用POST方法发送数据.用cURL上传文件等内容,需要的朋友可以参考下 1.cURL请求的基本步骤: (1)初始化 (2)设置选项,包括URL (3)执行并获取HTML文档内容 (4)释放cURL句柄 <?php //1.初始化 $ch = curl_init(); //2.设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.cnblog

  • php中curl.fsocket.file_get_content三个函数的使用比较 2015-04-21

    最近做一个网页小偷程序的时候才发现file_get_content已经完全不能满足需求了.我觉得,在读取远程内容的时候,file_get_content除了使用比curl便捷以外,其他都没有curl好 抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求也不大,所以没有学习使用curl. 直到最近,要做一个网页小偷程序的时候才发现file_get_c

  • asp.net中使用cookie传递参数的方法 2013-10-21

    这篇文章主要介绍了asp.net中使用cookie传递参数的方法,涉及asp.net针对cookie传值与接收的技巧,需要的朋友可以参考下 本文实例讲述了asp.net中使用cookie传递参数的方法.分享给大家供大家参考.具体如下: //传值 HttpCookie cookie = new HttpCookie("mycookie"); cookie.Value = "cookie值"; Response.AppendCookie(cookie); Respons

  • Shell脚本中判断输入变量或者参数是否为空的方法 2013-11-14

    这篇文章主要介绍了Shell脚本中判断输入变量或者参数是否为空的方法,本文总结了5种方法,并分别给出了代码实例,需要的朋友可以参考下 1.判断变量 read -p "input a word :" word if [ ! -n "$word" ] ;then echo "you have not input a word!" else echo "the word you input is $word" fi 2.判断输入参数

  • PowerShell函数中使用必选参数实例 2014-01-04

    这篇文章主要介绍了PowerShell函数中使用必选参数实例,即把一个参数设置为必选参数的方法,需要的朋友可以参考下 本文介绍在PowerShell创建自定义函数时,如何添加必选参数,可以使用Mandatory关键词. 默认情况下,PowerShell自定义的函数中,参数都是可选的(optional).如果要将一个参数设置为必选参数,那么必须对其设置Mandatory声明. function Test-Function { param( [Parameter(Mandatory=$true)]

  • PHP中curl,fscokopen和file_get_contents 使用分析 2014-03-05

    问:php中 curl, fsockopen ,file_get_contents 三个函数 都可以实现采集模拟发言 . 三者有什么区别,或者讲究么? 赵永斌: 有些时候用file_get_contents()调用外部文件,容易超时报错.换成curl后就可以.具体原因不清楚 curl 效率比file_get_contents()和fsockopen()高一些,原因是CURL会自动对DNS信息进行缓存(亮点啊 有我待亲测) 范佳鹏: file_get_contents curl fsockopen

  • C语言中宏定义使用的小细节 2014-03-15

    本篇文章是对C语言中宏定义使用的小细节进行了详细的分析介绍,需要的朋友参考下 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para ...........

  • 获取URL地址中的文件名和参数的javascript代码 2014-04-04

    JS 获取URL地址中的文件名和参数,这个版本中有详细的注释. //获取页面文件名 function GetPageName() { var url=window.location.href;//获取完整URL var tmp= new Array();//临时变量,保存分割字符串 tmp=url.split("/");//按照"/"分割 var pp = tmp[tmp.length-1];//获取最后一部分,即文件名和参数 tmp=pp.split("

  • js中settimeout方法加参数的使用实例 2014-05-14

    这篇文章主要介绍了js中settimeout方法加参数的使用,需要的朋友可以参考下 简单使用看w3school 里面没有参数调用, 例子如下 <script type="text/javascript"> function timedMsg() { var a ="dd"; var t=setTimeout(function(){ cao(a);},3000) } function cao(a) { alert(a); } </script>

  • Sql Server中存储过程中输入和输出参数(简单实例 一看就懂) 2014-08-18

    Sql Server中存储过程中输入和输出参数(简单实例,一看就懂),方便需要的朋友 [sql] -- ===================[创建存储过程]===================== USE [Message] GO /****** Object: StoredProcedure [dbo].[读取外部数据库查询] Script Date: 10/24/2012 05:39:16 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIE

  • Android中给fragment写入参数的轻量开发包FragmentArgs简介 2014-09-09

    这篇文章主要介绍了Android中给fragment写入参数的轻量开发包FragmentArgs简介,需要的朋友可以参考下 Android开发有时候会令人头痛.你不得不为诸如建立fragment这样简单的事情写很多代码.幸运的是java支持一个强大的工具:注释处理器(Annotation Processors). Fragment的问题是你不得不设置很多参数,从而让它正常运行.很多android开发新手通常这样写: public class MyFragment extends Fragment

  • SQL中函数 replace 的参数1的数据类型ntext无效的解决方法 2014-10-11

    SQL中函数 replace 的参数 1 的数据类型 ntext 无效.找了半天找到了解决办法 今天将一个ACC的数据库转换成ms-sql以后发现在使用replace替换语句的时候出现: SQL中函数 replace 的参数 1 的数据类型 ntext 无效.找了半天找到了解决办法: 因为ntext需要转化下 用如下语句即可解决: UPDATE 表 SET 字段=REPLACE(cast(字段 AS varchar(8000)),'被替换的内容','将要替换成的内容') varchar(8000

  • Mysql优化调优中两个重要参数table_cache和key_buffer 2014-12-07

    这篇文章主要介绍了Mysql优化调优中两个重要参数table_cache和key_buffer,需要的朋友可以参考下 本文根据作者的一点经验,讨论了Mysql服务器优化中两个非常重要的参数,分别是table_cache,key_buffer_size. table_cache指示表高速缓存的大小.当Mysql访问一个表时,如果在Mysql表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区,这样做的好处是可以更快速地访问表中的内容.一般来说,可以通过查看数据库运行峰值时间的状态值Open_tab

  • Jquery中ajax方法data参数的用法小结 2014-12-28

    本篇文章主要是对Jquery中ajax方法data参数的用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 $.ajax({ type: "POST", url: "some.php", data: "name=John&location=Boston", //第一种方式传参 // data: {name:"John",location:"Boston"} //第二种方式传参 // d

  • js中settimeout方法加参数 2014-12-29

    这篇文章主要介绍了js中settimeout方法加参数,需要的朋友可以参考下 js中settimeout方法加参数的使用. 简单使用看w3school 里面没有参数调用, 例子: <script type="text/javascript"> function timedMsg() { var a ="dd"; var t=setTimeout(function(){ cao(a);},3000) } function cao(a) { alert(a)

  • SQL Server 2008中的表值型参数 2014-06-27

    表值型参数(Table-valued parameters)是SQL Server 2008中引入的一种新特性,它提供了一种内置的方式,让客户端应用可以只通过单独的一条参化数SQL语句,就可以向SQL Server发送多行数据. 这一功能的基础是SQL Server 2008中最新的用户自定义表类型(User-Defined Table Types),它允许用户将表的定义注册为全局周知类型.注册之后,这些表类型可以像本地变量一样用于批处理中.以及存储过程的函数体中,很像早期SQL Server版

  • getopt/getopts:Bash中命令行选项/参数处理 2015-05-04

    0.引言 写程序的时候经常要处理命令行参数,本文描述在Bash下的命令行处理方式. 选项与参数: 如下一个命令行: ./test.sh -f config.conf -v --prefix=/home 我们称-f为选项,它需要一个参数,即config.conf, -v 也是一个选项,但它不需要参数. --prefix我们称之为一个长选项,即选项本身多于一个字符,它也需要一个参数,用等号连接,当然等号不是必须的,/home可以直接写在--prefix后面,即--prefix/home,更多的限制后