资讯专栏INFORMATION COLUMN

PHP cURL请求中CURLOPT_POSTFIELDS只支持一维数组

airborne007 / 612人阅读

摘要:使用发起请求时,我们会常用方法,具体的请求方式可以参考请求详解这篇文章。但我推荐,为了请求的规范化,应该全部使用对请求的参数进行编码。

使用PHP发起请求时,我们会常用cURL方法,具体的PHP请求方式可以参考 PHP cURL请求详解 这篇文章。

cURL发起POST请求

在使用中,如果你需要发送POST的请求,需要配置CURLOPT_POSTCURLOPT_POSTFIELDS两个参数,curl请求封装后的源码如下:

/**
 * 使用cURL方法获取接口数据
 * @param $uri 请求的url
 * @param $param 发起POST请求时携带的参数
 * @return array 请求返回的数据,解析成json格式
 */
public function fetchApi($uri, $param = array()) {
    // 初始化curl
    $ch = curl_init($uri);
    curl_setopt_array($ch, array(
        // 不直接输出,返回到变量
        CURLOPT_RETURNTRANSFER => true,
        // 设置超时为60s,防止机器被大量超时请求卡死
        CURLOPT_TIMEOUT => 60
    ));
    // 支持POST请求
    if (!empty($param)) {
        curl_setopt_array($ch, array(
            CURLOPT_POST => true,
            // 设置POST参数
            CURLOPT_POSTFIELDS => http_build_query($param)
        ));
    }
    // 请求数据
    $data = curl_exec($ch);
    // 关闭请求
    curl_close($ch);
    // 对数据进行编码,方便前后端数据处理
    return json_decode($data);
}
POST参数

如果需要使用POST方法,你需要设置CURLOPT_POST参数为true,并在CURLOPT_POSTFIELDS中传递post参数。

为什么使用http_build_query

需要注意的是CURLOPT_POSTFIELDS参数只支持一维数组参数,否则会出错,你可以本地测试:

为了测试这个功能,我们需要将上面的代码做一处修改:
替换行 CURLOPT_POSTFIELDS => http_build_query($param)
为:CURLOPT_POSTFIELDS => $param
// 测试发起多维数组的curl请求
public function actionTest() {
    $url = "www.baidu.com";
    // 此处为二维关联数组
    $param = array("foo" => ["bar" => "cow"]);
    $data = $this->fetchApi($url, $param);
    echo json_encode($data);
    return $data;
}

// 结果会报错:Array to string conversion

报错信息如下图:

如果我们需要避免这种多维数组的问题,就需要使用http_build_query方法:

函数声明:

/** 函数作用:根据数组生成URL-encode之后的请求字符串
    @param $query_data 可以是数组或包含public属性的对象
    @param $numeric_prefix 如果数组是数字下标,会使用该值作为数字下标前缀
    @param $arg_separator 参数分割符,默认为&
    @param $enc_type URL编码规范
    @return string URL编码后的字符串
*/
string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

实例获取数据:

// 一维数组
$data = array("foo", "bar", "baz", "boom", "cow" => "milk", "php" =>"hypertext processor");
echo http_build_query($data) . "
";
echo http_build_query($data, "myvar_");
// 结果:
// 0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor
// myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor

// 多维数组
$param = array("foo" => ["bar" => "cow"]);
echo http_build_query($data);
// 结果:foo%5Bbar%5D=cow 即:foo[bar]=cow
结论:

curl请求的POSTOPT_FIELDS只支持一维数组,如果是多维数组,需要使用http_build_query方法。但我推荐,为了请求的url规范化,应该全部使用http_build_queryPOST请求的参数进行编码。

参考资料

PHP手册 CRULOPT参数:http://php.net/manual/zh/func...

PHP手册 http_build_query: http://php.net/manual/zh/func...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28728.html

相关文章

  • PHP cURL请求详解

    摘要:不支持多进程,如果需要异步请求,非阻塞的方式,请选择。时会发送请求,类型为,是表单提交时最常见的一种。允许函数执行的最长秒数。设定请求中部分的内容。常规的使用来请求,功能强大,使用方便,按需配置。 在PHP后端的开发过程中,除了获取数据库的数据和处理数据的内部逻辑,往往还需要请求其他服务器接口的数据,我们一般有3种方式来获取数据,分别是: file_get_contents fsoc...

    paney129 评论0 收藏0
  • 考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

    摘要:最近做的一个需求,要通过调用,以格式上传文件。传统上,的支持通过在数组数据中,使用文件全路径的语法附加文件,供读取上传。的默认值为,的默认值为。对于而言,手动设置为是毫无意义的。命名空间或以下的版本没有命名空间。 最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件。踩坑若干,够一篇文章了。 重要警告 没事不要读PHP的官方中文文档!版本...

    NikoManiac 评论0 收藏0
  • 【web开发】php服务端提交post请求

    摘要:参见请求分析推测可能是对方服务器不接受这样的吧或者对的不兼容 服务端常见的post提交有三种方式,这里主要记录curl方式 1、服务端进行http-post的三种方法 1.1 通过curl函数 function post($url, $post_data = , $timeout = 5){//curl $ch = curl_init(); curl_setopt (...

    AndroidTraveler 评论0 收藏0
  • PHP发送和接收JSON请求

    摘要:发送接受是个可以访问请求的原始数据的只读流。在之前打开的数据流只能读取一次数据流不支持操作。不过,依赖于的实现,请求体数据被保存的时候,它可以打开另一个数据流并重新读取。 现在微服务中,很多API由于需要传递的参数较多所以要求用包含所有参数的JSON数据作为POST请求的请求体来替代FormData传递参数的方式,在参数量较多时POST JSON要比POST FormData便于开发和...

    PiscesYE 评论0 收藏0
  • PHP使用CURL,“撩”服务器需几行——php curl详细解析和常见大坑

    摘要:七夕啦,作为开发,妹子没得撩就撩下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。下面我们来看一些常用的情景,我们需要如何打扮自己配置参数才能正确撩妹正确撩到服务器。 七夕啦,作为开发,妹子没得撩就撩下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。好啦,长话短说再长说,祭出今天的工具——CURL(Client...

    SexySix 评论0 收藏0

发表评论

0条评论

airborne007

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<