PHP-can';t获取关联数组';结构权
我尝试使用cURL向API(mailchimp)发送请求。它与GET一起工作,但是,我在将GET URl转换为适当的关联PHP数组以通过POST发送时遇到问题。编辑,因为正如MarcB评论的那样,GET请求有一些负面影响,比如长度限制等 请注意,我用星号(*)替换了变量的值。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
这是工作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使用不同的请求格式