2014-05-23 29 views
-1

我嘗試使用cURL向API(mailchimp)發送請求。它適用於GET,但是,我有問題將GET-URl轉換爲通過POST發送的適當的關聯PHP數組。 編輯因爲隨着MarcB評論,GET請求有一些消極的一面,就像一個lenght限制等PHP - 無法獲得關聯數組的結構權利

請注意,我更換了變量的值與asteriks(*)。
這是工作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\"} 


不限想法,我在這裏想念什麼?這裏的結構不一樣嗎?

-
UPDATE
這是捲曲代碼:

對於初學者
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

這是一個很長的查詢字符串。那麼多的數據應該通過發佈,而不是GET查詢。由於某種原因,查詢字符串長度受限,並且您的某個地方可能會被截斷。 –

+0

嗨@MarcB,是的,謝謝你,你是對的。這就是爲什麼我想通過POST而不是GET來做到這一點。 GET只是嘗試,如果它的工作,但現在我得到這個錯誤,當使用POST,並不明白爲什麼? – Chris

+0

好吧,驗證錯誤看起來像JSON。 mailchimp API是否期望json?你是否正在做一個正確的json_encode(),如果是這樣的話? –

回答

1

OK,你不應該手動構建一個查詢字符串。您應該簡單地將您的關聯數組傳遞給CURLOPT_POSTFIELDS或使用類似http_build_query()http://www.php.net/manual/en/function.http-build-query.php)的東西來構建查詢字符串。

其次,您應該爲CURLOPT_POST字段使用值true

當然,這都是假設API正在期待application/x-www-form-urlencoded POST請求。我的猜測是,這可能並非如此,因爲您的回覆看起來像是在JSON中。

的MailChimp API文檔中的http://apidocs.mailchimp.com/api/2.0/

注此簡要概覽:

請求的數據被傳遞給API通過張貼JSON對象與適當的參數的API端點。

如果你實際上是使用此API版本,那麼我的猜測是,你需要做預期的格式來形成JSON對象ND使用application/json作爲ContentType標頭。

如果有幫助,我有一個非常輕量級的基於cURL的REST客戶端,歡迎您使用它來更輕鬆地與RESTful服務進行交互。看看這裏:https://github.com/mikecbrant/php-rest-client

0

我有同樣的錯誤,並通過添加一些額外的條件給我的捲曲調用它的工作。嘗試添加這些,看看它的工作原理:

$data = json_encode($data); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);