【发布时间】: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