PHP-can';t获取关联数组';结构权

PHP-can';t获取关联数组';结构权,php,arrays,curl,multidimensional-array,associative-array,Php,Arrays,Curl,Multidimensional Array,Associative Array,我尝试使用cURL向API(mailchimp)发送请求。它与GET一起工作,但是,我在将GET URl转换为适当的关联PHP数组以通过POST发送时遇到问题。编辑,因为正如MarcB评论的那样,GET请求有一些负面影响,比如长度限制等 请注意,我用星号(*)替换了变量的值。 这是工作GET参数: https://us3.api.mailchimp.com/2.0/ecomm/order-add.json?apikey=*** &order[id]=*** &order[camp

我尝试使用cURL向API(mailchimp)发送请求。它与GET一起工作,但是,我在将GET URl转换为适当的关联PHP数组以通过POST发送时遇到问题。编辑,因为正如MarcB评论的那样,GET请求有一些负面影响,比如长度限制等

请注意,我用星号(*)替换了变量的值。
这是工作GET参数:

https://us3.api.mailchimp.com/2.0/ecomm/order-add.json?apikey=***
&order[id]=***
&order[campaign_id]=***
&order[email_id]=***
&order[total]=***
&order[store_id]=***
&order[items][0][product_id]=***
&order[items][0][category_id]=***
&order[items][0][category_name]=***
&order[items][1][product_id]=***
&order[items][1][category_id]=***
&order[items][1][category_name]=***
...

这是POST请求的PHP数组:

Array
(
    [apikey] => ***
    [order] => Array
        (
            [id] => ***
            [campaign_id] => ***
            [email_id] => ***
            [total] => ***
            [order_date] => ***
            [shipping] => ***
            [tax] => ***
            [store_id] => ***
            [store_name] => ***
            [items] => Array
                (
                    [0] => Array
                        (
                            [product_id] => ***
                            [category_id] => ***
                            [category_name] => ***
                        )

                    [1] => Array
                        (
                            [product_id] => ***
                            [category_id] => ***
                            [category_name] => ***
                        )

                    ...

                )

        )

)

答复是:

Validation error: {\"order\":\"Please enter a struct\\\/associative array\"}

知道我在这里遗漏了什么吗?这里的结构不一样吗

--
更新:
这是curl代码:

function httpPost($url,$params)
{
  $postData = '';
   //create name value pairs seperated by &
   foreach($params as $k => $v) 
   { 
      $postData .= $k . '='.$v.'&'; 
   }
   rtrim($postData, '&');

    $ch = curl_init();  

    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_POST, count($postData));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);    

    $output=curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);
    return array($output, $httpCode);

}

print_r( httpPost( $mc_api_url, $curl_data ) );

对于初学者来说,您不应该手动构建查询字符串。您应该简单地将关联数组传递给
CURLOPT\u POSTFIELDS
,或者使用类似
http\u build\u query()
()的方法构建查询字符串

其次,您应该为
CURLOPT_POST
字段使用
true

当然,这都是假设API期望一个
应用程序/x-www-form-urlencoded
POST请求。我的猜测是,情况可能并非如此,因为您的回答似乎是JSON

MailChimp API文档简介

注意到:

请求数据通过使用适当的参数将JSON对象发布到API端点来传递给API

如果您实际使用的是这个API版本,那么我的猜测是您需要使用
application/JSON
作为ContentType头,以预期的格式nd生成JSON对象


如果有帮助的话,我有一个非常轻量级的基于cURL的REST客户端,欢迎您使用它来更轻松地与RESTful服务交互。请在这里查看:

我也有同样的错误,通过向curl调用添加一些额外的条件使其正常工作。尝试添加这些,看看是否有效:

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

这是一个相当长的查询字符串。那么多数据应该通过post传递,而不是GET查询。查询字符串的长度受到限制是有原因的,您的字符串可能会在某个地方被截断。您好@MarcB,是的,谢谢您,您说得对。这就是为什么我想通过POST而不是GET来做这件事。GET只是在测试它是否有效,但是现在我在使用POST时遇到了这个错误,我不明白为什么会出现这个错误?这个验证错误看起来像JSON。mailchimp API需要json吗?如果是这样的话,您是否正在使用正确的json_encode()?不,不幸的是,这不仅仅是使用json:(您可以向您展示生成cURL POST请求的代码吗?如果您已经为GET生成了查询字符串,那么您没有理由不能简单地为POST使用相同的查询字符串。唯一的问题是,目标服务器是否希望GET和POST使用不同的请求格式