【问题标题】:Is there a way to get response on error with HTTPClient in Ruby?有没有办法在 Ruby 中获得 HTTPClient 错误响应?
【发布时间】:2020-06-16 07:17:10
【问题描述】:

我正在使用 HTTPClient ruby​​ 库向我开发的 REST 服务发出一些基本的 http 请求,我现在想知道在发生错误时如何从服务获取响应(像 400 或 500 这样的状态代码是从服务返回)。

我的服务所做的是在中心返回产品的库存,因此它需要两个参数(在 url 中):产品 ID 和中心 ID。当我通过正确的产品和中心 ID 调用此服务时,该服务会返回 200 - OK 状态和产品库存(例如,8.0 表示该中心有 8 个产品单位)。但是,如果我传递了错误的产品 id(不在我们的数据库中),服务会返回 400 - Bad Request 和一条错误消息,指出该 id 不存在。

所以我在 Ruby 中有如下方法

def stock(product, location)
   response = @client.get_content("stock/#{product}/#{location}")
end                  

@client 是使用我配置的 HTTPClient.new 创建的实例。在传递 ''right'' 参数时,它会返回我想要的,所以它配置得很好

我现在的问题是,当服务返回错误状态代码时,会引发 HTTPClient::BadResponseError 异常,我无法在响应变量中检索此错误。

有没有办法从服务获取响应,无论它返回哪个状态码?我尝试使用begin...rescue,我可以获得一些信息,例如状态码和原因短语,但不是响应的内容(错误消息)

【问题讨论】:

    标签: ruby httpclient


    【解决方案1】:

    您正在使用get_content,它会跳过几个步骤并返回内容。而是退一步使用get,这将返回一个更完整的响应结构,其中包括您想要的status 字段:

    def stock(product, location)
      response = @client.get("stock/#{product}/#{location}")
    
      body = response.body
      status = response.status
    end 
    

    【讨论】:

    • 非常感谢!这正是我想要的
    猜你喜欢
    • 2021-04-09
    • 2019-09-08
    • 2019-01-23
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多