使用 CURLOPT_POSTFIELDS 时数组 2 字符串转换

Array 2 string conversion while using CURLOPT_POSTFIELDS

我有以下代码:

// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

我的$postfields变量是一个参数数组。我注意到有数组到字符串的转换。它确实有效。

我可以使用 http_build_query() 函数来取消通知,但是我使用 @path_to_file 来包含 post 文件。 http_build_query() 中断文件包含。

我想知道是否有更多 "proper" 方法可以做到这一点。不生成通知。

$postfields 数组的某些值本身是什么?这很可能是导致通知的原因。 curl_setops 期望它的第三个参数是一个数组,其键和值是字符串,如 PHP's manual page for the function 中所述,尽管可能不是很清楚:

This parameter 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.

在此引用中,关键点是 para1/2 和 val1/2 是字符串,如果需要,您可以将它们作为数组提供,其中键为 para1 和 para2,值为val1 和 val2.

两种消除通知的方法

第一个是使用http_build_query()并用CURLFile objects. This is only possible if you're using PHP 5.5 or above, unfortunately. The manual's page has a pretty clear and simple example of use替换你对@filepath的使用。

如果您不适合使用 CURLFiles,那么 第二种 方法是 json_encode() 您的 $postfields 数组的值,它们本身就是数组.这并不优雅,它需要你解码另一边的 JSON。

如果你想发送多维数组,j11e 的答案将不起作用

试试这个递归函数。

https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f

<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
    if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
        $returnArray[$existingKeys]=$data;
        return $returnArray;
    }
    else{
        foreach ($data as $key => $item) {
            build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
        }
        return $returnArray;
    }
}

你可以这样使用它。

curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));

使用 Laravel 对我有用的一件事是在请求 header 中使用标签 'Content-Type: application/json',然后发送我的数据 json 编码如下:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

在接收请求参数的函数中我没有使用json解码函数,我访问参数就像

$request->something

经过一个小时的研究,这里是我修复代码的方式:

$strVar = '';
if ($data) {
        $ea = build_post_fields($data);
        foreach($ea as $key=>$val) {
                $strVar.= "$key=$val&";
        }
}


/* eCurl */
$curl = curl_init($url);

/* Set Array data to POST */
curl_setopt( $curl, CURLOPT_POSTFIELDS, ($strVar) );

下面是我从@Yisrael Dov 那里得到的函数:


function build_post_fields( $data, $existingKeys='', $returnArray=[]){
    if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
        $returnArray[$existingKeys]=$data;
        return $returnArray;
    }
    else{
        foreach ($data as $key => $item) {
            build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
        }
        return $returnArray;
    }
}

完美!您可以 post 一个深度数组,例如:

$post_var = array(
'people' => array('Lam', 'Hien', 'Nhi'),
'age' => array(12, 22, 25)
);

美好的一天!