2013-08-20 27 views
0

我提出以下API GET請求,使用Ruby 1.9.3和httparty寶石解碼請求作爲有效的JSON:無法使用Ruby

uri= HTTParty.post("www.surveys.com/api/v2/contacts", 
:basic_auth => auth, 
:headers => { 'ContentType' => 'application/json' }, 
:body => { 
    "custom_test" => test, 
    "name" => firstname, 
    "email" => emailaddress 
} 

變量authtestfirstname ,和emailaddress有效。這是我從我的請求中收到的回覆:

{ 
    "code": "invalid_json", 
    "description": "Request sent with Content-Type: application/json but was unable to decode request body as valid json.", 
    "success": false 
} 
500 
#<Net::HTTPInternalServerError:0x007fe4eb98bde0> 

發佈此JSON請求的方式有什麼問題?

編輯:它可能值得注意的是,API允許你定義一個聯繫人的自定義屬性,因此正文中的「custom_test」屬性。

+0

確定的API是不扔的是因爲它缺少在請求一些片非可選的數據?您應該嘗試將其發佈到本地Web服務器並捕獲輸出,因爲您的代碼對我來說看起來是正確的。 –

回答

3

由於您收到內部服務器錯誤(500)而不是未被接受(406),最有可能是服務器上存在編碼問題,因爲他不期待的異常正在發生而不是傳遞給您很好的錯誤解釋什麼是錯的(這將是我的第一次猜測)。

但讓我們說這是JSON通信的問題。也許你必須指定你接受json格式?

嘗試

:headers => { 'ContentType' => 'application/json', 'Accept' => 'application/json' }, 

w3 Accept報頭定義:

的接受請求標頭字段可以被用於指定其是用於響應上可接受的某些媒體類型。可以使用Accept頭來指示請求特別限於一小組所需的類型,例如請求嵌入式圖像的情況。

和Content-Type頭定義:

內容類型實體頭字段指示在HEAD方法的情況下發送給接收方,或實體主體的媒體類型,將要發送的媒體類型具有請求GET。

+0

我相信它也是服務器的問題。我已經將這些信息傳遞給了開發團隊,以便他們看到它們的結局。感謝您的幫助,+1接受標題定義 - 每天學習新東西。 – Luigi

2

你正在發送一個普通的HTTP查詢字符串,並說它是json。 來自HTTParty手冊:「body:請求的主體,如果它是一個哈希,它將被轉換爲查詢字符串格式,否則它將按原樣發送。

嘗試:

:body => JSON.generate({ 
    "custom_test" => test, 
    "name" => firstname, 
    "email" => emailaddress 
}) 

你需要需要「JSON」