PHP - 无法获得关联数组的结构

时间:2014-05-23 19:37:16

标签: 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[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\"}

任何想法,我在这里缺少什么?这里的结构不一样吗?

-
更新的:
这是卷曲代码:

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 ) );

2 个答案:

答案 0 :(得分:1)

对于初学者来说,不应该手动构建查询字符串。您应该简单地将关联数组传递给CURLOPT_POSTFIELDS,或者使用http_build_query()http://www.php.net/manual/en/function.http-build-query.php)之类的内容构建查询字符串。

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

当然,这是假设API期望application/x-www-form-urlencoded POST请求。我的猜测可能不是这种情况,因为你的回答看起来像是在JSON中。

简要介绍http://apidocs.mailchimp.com/api/2.0/

上的MailChimp API文档

请注意:

  

通过使用适当的参数将JSON对象POST到API端点,将请求数据传递给API。

如果你实际上正在使用这个API版本,那么我猜你需要使用application/json作为ContentType标题以预期格式nd形成JSON对象。

如果它有帮助,我有一个非常轻量级的基于cURL的REST客户端,欢迎您使用它来更轻松地与RESTful服务进行交互。请在此处查看:https://github.com/mikecbrant/php-rest-client

答案 1 :(得分:0)

我遇到了同样的错误,并通过在我的curl调用中添加一些额外条件来实现它。尝试添加这些并查看它是否有效:

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