检查Ruby HTTP响应是否成功

cbm*_*ica 39 ruby

如何正确检查Net :: HTTP :: Get(例如)的响应是否为"成功"(即2xx返回码)?在这个简单的问题上,文档似乎很遗憾.

我有:

response=Net::HTTP.new( host, port ).request my_get_request # details not important
Run Code Online (Sandbox Code Playgroud)

经过一堆谷歌搜索和近乎随机的打字,我终于确定这是有效的:

response.class < Net::HTTPSuccess
Run Code Online (Sandbox Code Playgroud)

这实际上是规范的方式吗?

And*_*all 70

对于Net::HTTP,是的,检查响应对象的类是这样做的方法.使用kind_of?更清晰(但在功能上等同于使用<):

response.kind_of? Net::HTTPSuccess
Run Code Online (Sandbox Code Playgroud)

调用valueresponse也将提高一个Net::HTTPError如果状态代码是不是成功的(什么命名方法很差......).

如果可以,您可能需要考虑使用gem而不是Net::HTTP,因为它们通常提供更好的API和性能.百头巨怪HTTParty两个很好的人,等等.

  • 这段代码很有趣."回应有点成功?不,不是.这部分很好,但是".:) (3认同)
  • 然后我猜任何使用它的人应该知道服务器可能会返回"304 Not Modified",因此可能也想检查`Net :: HTTPRedirection`情况! (2认同)

tan*_*rix 17

您可以利用Ruby的case语句,该语句惯用于执行类比较,这要归功于它在引擎盖下使用===.

以下是来自JSON客户端的示例,它捕获特定错误,但只返回服务器的消息:

  case response
    when Net::HTTPSuccess
      JSON.parse response.body
    when Net::HTTPUnauthorized
      {'error' => "#{response.message}: username and password set and correct?"}
    when Net::HTTPServerError
      {'error' => "#{response.message}: try again later?"}
    else
      {'error' => response.message}
  end
Run Code Online (Sandbox Code Playgroud)

注意上面的Net :: HTTPResponse父类(例如Net::HTTPServerError)也可以工作.