2013-01-16 83 views
1

我正在構建一個使用cURL命令對API的腳本。我發送格式爲application/json請求的cURL命令並獲得結果,我將其解析爲一個Ruby哈希。Ruby JSON.parse錯誤

當我使用cURL POST命令,獲得格式正確的JSON響應時,這很好用。然而,當使用捲曲GET命令我返回頭有一個JSON文件:「HTTP/1.1」

puts r: 

HTTP/1.1 200 OK 
X-Compute-Request-Id: req-7e625990-068b-47d1-8c42-9d3dd3b27050 
Content-Type: application/json 
Content-Length: 1209 
Date: Wed, 16 Jan 2013 20:47:41 GMT 

{ <JSON DATA> } 

當我嘗試做一個JSON.parse(r)我得到一個意外的標記錯誤的。

我對這個方法:

def list_flavors 

    r = %x(curl -s -k -D - -H \"X-Auth-Token: #{$token}\" -X 'GET' http://10.30.1.49:8774/v2/27e60c130c7748f48b0e3e9175702c30/flavors -H 'Content-type:  application/json') 

    response = JSON.parse(r) 

    response 
end 

是否有使用正則表達式來拉身出來的JSON文檔,然後解析的方法嗎?

或者當我從cURL獲得響應時,會以錯誤的方式解決這個問題?

+1

如果你不想要標題,你爲什麼要傳遞-D選項?無論如何,使用net/http將會更好(或者其中一個例如restclient的包裝) –

+0

嘿弗雷德裏克 - 感謝你! – Mike

+0

爲什麼不使用[Curb](https://github.com/taf2/curb)gem?這使得處理cURL變得更容易和習慣。 –

回答

2

在將字符串傳遞到JSON.parse之前,您需要找到切出該標頭的方法。 JSON.parse只期望有效的json。

不是捲曲和使用的東西批發爲一個字符串,我建議你使用非常靈活紅寶石Net::HTTP和/或OpenURI庫,這將讓您輕鬆訪問只是你迴應的身體沒有頭。

+0

我之前檢出過URI,但是我提出的請求的API嚴格使用cURL POST,GET和DELETE命令檢索JSON或發送JSON響應。 – Mike

+0

較低級別的Net :: HTTP可以使用任何請求標頭,即。 'Net :: HTTP :: Get.new','Net :: HTTP :: Post.new'和'Net :: HTTP :: Delete.new'。它們與您正在訪問的API的curl請求實際上沒有區別。 –

+0

很高興知道,我將查看Net :: HTTP – Mike