2013-07-22 51 views
2

我有代碼看起來像這樣:如何從Groovy中的REST客戶端獲取Slurpable數據?

def client = new groovyx.net.http.RESTClient('myRestFulURL') 

def json = client.get(contentType: JSON) 
net.sf.json.JSON jsonData = json.data as net.sf.json.JSON 
def slurper = new JsonSlurper().parseText(jsonData) 

但是,這是行不通的! :(上面的代碼在parseText中給出了一個錯誤,因爲json元素沒有被引用。首要的問題是「數據」是作爲一個Map返回的,而不是真正的Json。沒有顯示,但我的第一次嘗試,我剛剛通過在parseText(json.data),這也是有關無法解析一個HashMap錯誤

所以我的問題是:如何獲得JSON從RESTClient實現返回由JsonSlurper解析

回答

5

RESTClient?類自動解析內容,並且似乎不可能阻止它這樣做。

但是,如果您使用HTTPBuilder,則可以重載該行爲。要獲取信息bac k作爲文本,但如果僅將contentType設置爲TEXT,則它將不起作用,因爲HTTPBuilder使用HTTPBuilder.get()方法的contentType參數來確定要發送的HTTP頭和Accept以及要在其上執行的解析返回的對象。在這種情況下,您需要在Accept標頭中使用application/json,但您需要解析TEXT(即不解析)。

解決方法是在調用get()之前在HTTPBuilder對象上設置Accept標題。這會覆蓋否則會在其上設置的標題。下面的代碼爲我運行。

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.6') 
import static groovyx.net.http.ContentType.TEXT 

def client = new groovyx.net.http.HTTPBuilder('myRestFulURL') 
client.setHeaders(Accept: 'application/json') 

def json = client.get(contentType: TEXT) 
def slurper = new groovy.json.JsonSlurper().parse(json) 
+0

這只是完美的作品!謝謝!我會說,當我轉換時,我錯過了從「parseText」中「解析」的變化。上面的「json」變量實際上是一個StringReader,所以「parse」是必需的方法。 – JoeG

+0

看起來像一個很好的解決方法,但不是任何人都好奇,爲什麼當響應是JSON RESTClient返回一個HashMap?我得到了同樣的東西,我想了解爲什麼它返回一個hashmap,以及如何將其轉換爲JSON(如果這不是一個bug) – Marc

+0

我現在明白了,我會發布另一個解決方案 – Marc

0

由jesseplymale發佈的解決方案也爲我工作。

HttpBuilder有依賴一些appache庫, 所以要避免添加這種依賴關係到你的項目, 你可以採取這種解決方案而不使用HttpBuilder的:

def jsonSlurperRequest(urlString) { 
    def url = new URL(urlString) 
    def connection = (HttpURLConnection)url.openConnection() 
    connection.setRequestMethod("GET") 
    connection.setRequestProperty("Accept", "application/json") 
    connection.setRequestProperty("User-Agent", "Mozilla/5.0") 
    new JsonSlurper().parse(connection.getInputStream()) 
} 
+0

但是,如果您需要支持通過代理服務器,使用HttpBuilder將會更好。 – JoeG

1

從RESTClient實現響應的類型會取決於版本:

org.codehaus.groovy.modules.http-builder:http-builder

例如,版本0.5.2,我是得到一個net.sf.json.JSONObject回來。

在版本0.7.1中,它現在根據問題的觀察結果返回一個HashMap。

當它是一張地圖,你可以使用正常的地圖操作簡單訪問JSON數據:

def jsonMap = restClientResponse.getData() def user = jsonMap.get("user") ....

相關問題