【问题标题】:PHP - can't get associative array's structure rightPHP - 无法正确获取关联数组的结构
【发布时间】:2014-05-23 19:37:16
【问题描述】:

我尝试使用 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 ) );

【问题讨论】:

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

标签: php arrays curl multidimensional-array associative-array


【解决方案1】:

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

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

当然,这一切都假设 API 期待 application/x-www-form-urlencoded POST 请求。我的猜测是,情况可能并非如此,因为您的响应似乎是 JSON 格式。

http://apidocs.mailchimp.com/api/2.0/http://apidocs.mailchimp.com/api/2.0/MailChimp API 文档简介

注意这一点:

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

如果您实际使用此 API 版本,那么我猜您需要以预期格式形成 JSON 对象,并使用 application/json 作为 ContentType 标头。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2012-05-05
      • 2011-12-07
      • 2018-03-28
      • 2018-10-26
      相关资源
      最近更新 更多