我正在使用groovy RESTClient 0.6来发出POST请求。我希望响应中有一个XML有效负载。我有以下代码:
def restclient = new RESTClient('<some URL>')
def headers= ["Content-Type": "application/xml"]
def body= getClass().getResource("/new_resource.xml").text
/*
If I omit the closure from the following line of code
RESTClient blows up with an NPE..BUG?
*/
def response = restclient.post(
path:'/myresource', headers:headers, body:body){it}
println response.status //prints correct response code
println response.headers['Content-Length']//prints 225
println response.data //Always null?!
response.data始终为null,即使我使用Google Chrome的postman客户端尝试相同的请求时,我也会回复预期的响应主体。这是RESTClient的已知问题吗?
答案 0 :(得分:8)
HTTP Builder文档说数据应该包含已解析的响应内容,但正如您所发现的那样,它不会。但是,您可以从reader对象获取已解析的响应内容。我发现这样做的最简单,最一致的方法是在RESTClient对象上设置默认的成功和失败闭包,如下所示:
def restClient = new RESTClient()
restClient.handler.failure = { resp, reader ->
[response:resp, reader:reader]
}
restClient.handler.success = { resp, reader ->
[response:resp, reader:reader]
}
你会在成功和失败方面得到同样的东西:包含响应(它是HttpResponseDecorator
的一个实例)和读者的地图(其类型将由响应主体的内容决定) )。
然后,您可以访问响应和读者:
def map = restClientAdapter.get([:]) // or POST, OPTIONS, etc.
def response = map['response']
def reader = map['reader']
assert response.status == 200
答案 1 :(得分:0)
我遇到了类似的问题,我从Sams解决方案中得到了提示,但是使用了闭包来解决它(类似的解决方案,但使用闭包而不是返回的对象进行编码)。
resp.data
在使用RESTClient时始终为null,但是reader
包含数据,因此看起来像这样:
def restclient = new RESTClient('<some URL>')
def headers= ["Content-Type": "application/xml"]
def body= getClass().getResource("/new_resource.xml").text
try {
restclient.post(path:'/myresource', headers:headers, body:body) { resp, reader ->
resp.status // Status Integer
resp.contentType // Content type String
resp.headers // Map of headers
resp.data // <-- ALWAYS null (the bug you faced)
reader // <-- Data you're looking for
}
} catch (Exception e) {
e.response.status // Get HTTP error status Integer
}