PHP - не может получить правильную структуру ассоциативного массива
Я пытаюсь отправить запрос в API (mailchimp) с помощью cURL. Он работает с 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]=***
...
Это массив PHP для запроса POST:
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 ) );
2 ответа
Хорошо для начала, вы не должны вручную строить строку запроса. Вы должны либо просто передать свой ассоциативный массив 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
ПОЧТОВЫЙ запрос Я предполагаю, что это может быть не так, поскольку ваш ответ кажется, что это в JSON.
Краткий обзор документации MailChimp API по адресу http://apidocs.mailchimp.com/api/2.0/
Отмечает это:
Данные запроса передаются в API путем размещения объектов JSON в конечных точках API с соответствующими параметрами.
Если вы на самом деле используете эту версию API, то я предполагаю, что вам нужно формировать объекты JSON в ожидаемом формате и использовать application/json
как заголовок ContentType.
Если это поможет, у меня есть очень легкий клиент REST на основе cURL, который вы можете использовать для более простого взаимодействия со службами RESTful. Проверьте это здесь: https://github.com/mikecbrant/php-rest-client
У меня была та же ошибка, и я получил ее, добавив несколько дополнительных условий к моему вызову curl. Попробуйте добавить их и посмотрите, работает ли это:
$data = json_encode($data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);