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