【问题标题】:Response from a POST request in Groovy RESTClient is missing dataGroovy RESTClient 中 POST 请求的响应缺少数据
【发布时间】:2013-12-01 05:42:44
【问题描述】:

我正在使用 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 始终为空,即使当我使用 Google chrome 的邮递员客户端尝试相同的请求时,我也会得到预期的响应正文。这是 RESTClient 的已知问题吗?

【问题讨论】:

  • 发出 POST 请求时{it} 是什么?
  • @dmahapatro RESTClient.post 方法接受一个闭包作为最后一个参数。您可以发送代码来处理闭包中的响应。有趣的是,如果你不使用接受闭包的 post 方法的重载,post 方法就会爆炸。 :-(

标签: groovy httpbuilder


【解决方案1】:

HTTP Builder 文档说数据应该包含解析的响应内容,但正如您所发现的,它只是没有。但是,您可以从阅读器对象中获取解析后的响应内容。我发现这样做的最简单、最一致的方法是在 RESTClient 对象上设置默认的成功和失败闭包,如下所示:

def restClient = new RESTClient()
restClient.handler.failure = { resp, reader ->
    [response:resp, reader:reader]
}
restClient.handler.success = { resp, reader ->
    [response:resp, reader:reader]
}

你会在成功和失败时得到相同的结果:一个包含响应的 Map(它是 HttpResponseDecorator 的一个实例)和阅读器(其类型将由响应正文的内容决定)。

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

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

assert response.status == 200

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我从 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2011-08-27
      • 2015-07-02
      • 2018-07-18
      • 2016-06-05
      相关资源
      最近更新 更多