PHP的CURLOPT_POSTFIELDS参数使用数组和字符串的区别

手册上解释:

CURLOPT_POSTFIELDS 

全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似‘para1=val1&para2=val2&...‘或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会设置成multipart/form-data。

PHP的CURL组件是非常常用的HTTP请求模拟器。

正确使用方法:

通常要发送post数据时,我已经习惯于这样写:

curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data);
但是在向某一个服务器发送请求的时候,服务器返回500。而使用socket方式连接上去发送请求,返回正常的数据。

尝试发送到一个仅有<?php print_r($_SERVER);?>的网页上,可以看到使用数组发送POST数据时,收到的CONTENT_TYPE如下:
[CONTENT_TYPE] => multipart/form-data; boundary=—————————-f924413ea122
而使用http_build_query($post_data),收到的CONTENT_TYPE如下:
[CONTENT_TYPE] => application/x-www-form-urlencoded

可见,当CURLOPT_POSTFIELDS被设置为数组时,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。虽然对于大多数web服务器并没有影响,但是还是有少部分服务器不兼容。

本文得出的结论是,在没有需要上传文件的情况下,尽量对post提交的数据进行http_build_query,然后发送出去,能实现更好的兼容性,更小的请求数据包。

备注:

string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

使用给出的关联(或下标)数组生成一个经过URL-encode 的请求字符串。

curl发送post数据的时候,如果用http_build_query生成对应的post数据,则不用urlencode编码对应的字符串了

如果是手动拼接,则需要对中文手动用urlencode编码

时间: 2024-11-06 20:13:50

PHP的CURLOPT_POSTFIELDS参数使用数组和字符串的区别的相关文章

数组和字符串方法区别

字符串 1字符串不可变的, 如果对字符串的某个索引赋值,不会有任何错误,但是没有任何效果 如: var s = 'Text'; s[0] = 'X;' alert(s); //s仍然是'Text' 2JavaScript为字符串提供一些常用方法,注意: 调用方法本身不会改变原有字符串的内容,而是返回一个新字符串. 2.1 toUpperCase  把字符串中的字母变为全大写 2.2 toLowerCase  把字符串中的字母变为全小写 2.3 indexOf 索引指定字符串出现的位置  如  v

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

10-C语言数组、字符串

一. 数组的基本概念 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢? 1. 什么是数组 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 2. 数组的特点 l 只能存放一种类型的数据,比如int类型的数组.float类型的数组 l 里面存放的数据称为“元素” 二. 数组的定义 1. 定义 l 声明数组的类型 l 声明数组的元素个数(需要多少存储空间) 2. 格式 元素类型 数组名[元素个数]; 比如:int ages[3]; 3. 简单使用 l 简单初始

对于数组(字符串)slice方法的总结

数组(字符串)使用slice方法的目的就是截取目标数组(字符串),通俗的来讲就是截取想要的.网上有很多slice方法的实例加以说明,在此主要是从特殊到一般对此方法进行了总结. 先说总结的方法,再看下面的例子进行理解. 假设已知一个数组长度为len,则参数的有效范围为[-len,len-1],-len和0为第一个元素的下标,-1和len-1表示最后一个元素的下标.slice()总共有两个参数,不填参数返回所有元素:若只填一个参数x,则x为起始元素的下标(起始元素一定会被截取),返回x之后的所有元素

黑马程序员--数组与字符串

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 数组 用来存储一组数据 特点:只能存储一种类型的数据 格式: 格式类型数组名 [元素个数]; int a[10];  //定义一个整形的数组a 里面包含10个元素,下标从0开始,即a[0],a[1]…a[9] 10个数据 数组必须先定义然后才能使用/ 数组的初始化 可以再定义数组时进行赋值 例 a[5]={0,1,2,3,4};   定义的初值一次放在一对花括号内,经过上面的定义和初始化后 a

舌尖上的javascript数组和字符串基本操作

Javascript数组基本操作 Javascript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,然而这些数字索引在内部被转换为字符串类型,这是因为javascript对象中的属性名必须是字符串. 一:如何创建数组? 创建数组有2中方式,第一种是对象字面量如下: var  arrs = [];  // 定义了一个空数组. 还有一种方式是:调用Array的构造函数创建数组 var arrs = new Array(); 二:数组的基本操作如下: 1. 把字符串转换

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

常用数组、字符串方法总结&amp;获取元素、DOM操作

字符串的方法.返回值.是否改变原字符串:1 charAt() 方法可返回指定位置的字符. 不改变原始字符串 JavaScript并没有一种有别于字符串类型的字符数据类型,返回的字符是长度为 1 的字符串: 注释:字符串中第一个字符的下标是 0.如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串. 2 concat() 方法用于连接两个或多个字符串并返回连接后的字符串 不改变原始字符串 语法:stringObject.concat(stringX,str

PHP数组和字符串函数

1.1关于数组操作的函数 1.1.1range(start,end) 创建一个数组,值从start开始,一直到end结束 如果range里面的参数是数字,那么他直接按照数字大小的顺序排序,如果里面的参数是一个字符,那么他将按照ascii编码的顺序排序. 1.1.2array_rand() 随机取出一个数组的下标 array_rand存在第二个参数,默认情况下是1,代表获取一个数组元素的下标,他的数据类型等同于下标的数据类型,但是如果一次性随机获取多个元素的下标,他返回的是一个数组. 虽然他是随机