如何从Groovy中的REST客户端获取Slurpable数据?

时间:2013-07-22 14:14:35

标签: json rest groovy

我的代码如下:

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的错误。

所以我的问题是:如何让RESTClient返回的JSON被JsonSlurper解析?

3 个答案:

答案 0 :(得分:6)

RESTClient类会自动解析内容,但似乎无法阻止内容。

但是,如果您使用HTTPBuilder,则可能会使行为超载。您希望以文本形式返回信息,但如果仅将contentType设置为TEXT,则无效,因为HTTPBuilder使用contentType参数HTTPBuilder.get()方法确定要发送的Accept HTTP标头,以及对返回的对象进行的解析。在这种情况下,application/json标头中需要Accept,但您希望解析TEXT(即不进行解析)。

您解决此问题的方法是在Accept对象上设置HTTPBuilder标头,然后再调用get()。这将覆盖否则将在其上设置的标头。以下代码适用于我。

@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)

答案 1 :(得分:1)

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())
}

答案 2 :(得分: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") ....