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);
Другие вопросы по тегам