来自Groovy RESTClient中的POST请求的响应是缺少数据

The*_*nor 4 groovy httpbuilder

我使用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?!
Run Code Online (Sandbox Code Playgroud)

response.data始终为null,即使我使用Google Chrome的postman客户端尝试相同的请求时,我也会返回预期的响应主体.这是RESTClient的已知问题吗?

Sam*_* T. 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]
}
Run Code Online (Sandbox Code Playgroud)

在成功和失败方面你会得到同样的东西:一个包含响应(它是一个实例HttpResponseDecorator)和读者(其类型将由响应主体的内容决定)的地图.

然后,您可以访问响应和阅读器:

def map = restClient.get([:]) // or POST, OPTIONS, etc.
def response = map['response']
def reader = map['reader']

assert response.status == 200
Run Code Online (Sandbox Code Playgroud)