2014-07-01 34 views
0

我通過curl和POST將它連接到API。試圖瞭解如何將此PHP POST格式化爲Curl POST格式

的API支持,只是說,我應該成爲我的要求是這樣:

「如果你發送POST請求與內容類型JSON和類似什麼是下面你應該關閉一個身體的正確網址一個良好的開端:

{ 
    "contact": { 
    "email": "[email protected]", 
    "last_name": "Johnston", 
    "company": "MyApi", 
    "first_name": "Justin" 
    } 
} 

不過,我認爲這是一個普通的PHP後也許並不能爲CURL這是我在用

因此,捲曲的代碼,我是:

//Set Curl options 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "first_name=" . $db->f('fname') . "&last_name=" . $db->f('lname') . "&email=" . $db->f('Email') . "&company=" . $db->f('studio_name') . ""); 

然而,當我運行POST,響應我從API回說:

{"error":"Invalid parameters. Should be a hash in the form { 'contact' : { } }."} 

所以,我假設這是因爲我的POSTFIELDS是不正確的,我知道我需要以「聯繫」引導,但我不知道如何格式化並且無法找到示例。任何想法?

非常感謝您的幫助!我真的很感激!!

克雷格

+1

我認爲問題是你發送一個字符串作爲參數,它應該是一個JSON對象。只需使用json_encode()對數據數組進行編碼,然後通過POST發送,而不是您正在形成的字符串。 – SharkofMirkwood

+0

看看[this](http://stackoverflow.com/a/6213693/696600)是否有幫助。 – tradyblix

回答

2

要在我張貼的評論擴大...

我認爲這個問題是你發送一個字符串作爲參數,其中 它應該是一個JSON對象。只需使用json_encode()編碼的 陣列的數據和發送通過POST而不是字符串的你 形成

你需要創建一個JSON字符串(通常是通過編碼數據的數組):

$data = array(
    "contact" => array(
     "first_name" => $db->f('fname'), 
     "last_name" => $db->f('lname'), 
     "email"  => $db->f('Email'), 
     "company" => $db->f('studio_name') 
    ) 
); 
$data = json_encode($data); 

這會給你你需要發佈JSON,所以只要改變你的代碼行的參數設置如下:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

編輯:根據評論的要求,我會試着再多解釋一下:

POST請求被髮送到服務器,並且您可以發送任何您想要的數據和請求。在這個問題給出的例子,這是有效的JSON和他們指定的請求的主體也應該是JSON(我以同樣的格式假設):

{ 
    "contact": { 
    "email": "[email protected]", 
    "last_name": "Johnston", 
    "company": "MyApi", 
    "first_name": "Justin" 
    } 
} 

在我的解決方案上面的我我已經解釋瞭如何獲取包含有效JSON的字符串作爲數據數組;這個字符串可以作爲請求的內容發送。 並附上您嘗試什麼的問題是,整個數據會從字面上被送往這樣的:

first_name=Justin&last_name=Johnston&[email protected]&company=MyApi 

這是可以理解的混淆,因爲是這是你如何獲取數據從一個HTML表單返回,並且是通過POST發送變量的一種常見方式。但是在這種情況下,你需要使用JSON,這就是爲什麼不起作用。

+1

優秀的答案。可能想向OP解釋發佈請求與其中包含的api請求數據之間的差異。他/她似乎混淆了兩個 – r3wt

+1

@ r3wt我已經擴展了我的答案,試圖使它更清晰,如果我沒有做出好的工作,請隨時編輯! – SharkofMirkwood

+0

我認爲你做得很好。 upvoted – r3wt