检查 Ruby HTTP 响应是否成功
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12023231/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Check Ruby HTTP response for success
提问by cbmanica
How does one properly check the response from Net::HTTP::Get (for example) for "success" (i.e., a 2xx return code)? The documentation seems to be sadly silent on this simple question.
如何正确检查来自 Net::HTTP::Get 的响应(例如)“成功”(即 2xx 返回码)?可悲的是,文档似乎对这个简单的问题保持沉默。
I have:
我有:
response=Net::HTTP.new( host, port ).request my_get_request # details not important
After a bunch of Googling and near-random typing, I finally determined that this works:
经过一堆谷歌搜索和近乎随机的打字,我终于确定这是有效的:
response.class < Net::HTTPSuccess
Is that actually the canonical way to do it?
这实际上是规范的做法吗?
回答by Andrew Marshall
For Net::HTTP, yes, checking the class of the response object is the way to do it. Using kind_of?is a bit clearer (but functionally equivalent to using <):
对于Net::HTTP,是的,检查响应对象的类是这样做的方法。Usingkind_of?更清晰一点(但功能上等同于 using <):
response.kind_of? Net::HTTPSuccess
Calling valueon responsewill also raise a Net::HTTPErrorif the status code was not a successful one (what a poorly named method…).
如果状态代码不成功,调用valueonresponse也会引发 a Net::HTTPError(多么糟糕的命名方法......)。
If you can, you may want to consider using a gem instead of Net::HTTP, as they often offer better APIs and performance. Typhoeusand HTTPartyare two good ones, among others.
如果可以,您可能需要考虑使用 gem 而不是Net::HTTP,因为它们通常提供更好的 API 和性能。Typhoeus和HTTParty是两个很好的,等等。
回答by tantrix
You can take advantage of Ruby's casestatement which idiomatically performs class comparisons, thanks to its use of ===under the hood.
您可以利用 Ruby 的case语句,该语句惯用地执行类比较,这要归功于它在底层使用===。
Here's an example from a JSON client that catches particular errors but otherwise just returns the server's message:
下面是一个来自 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
Note above Net::HTTPResponse parent classes(e.g. Net::HTTPServerError) work too.
注意上面的Net::HTTPResponse 父类(例如Net::HTTPServerError)也可以工作。
回答by Ryan Snodgrass
If all you're looking to grab is the HTTP status code of an external API or website, then try Net::HTTP.get_response.
如果您只想获取外部 API 或网站的 HTTP 状态代码,请尝试Net::HTTP.get_response.
Net::HTTP.get(url)returns a string. You won't be able to easily parse the header response from it:
Net::HTTP.get(url)返回一个字符串。您将无法轻松解析它的标头响应:
url = URI('http://example.com')
string_response = Net::HTTP.get(url)
# => "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style type=\"text/css\">\n body {\n background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n \n }\n div {\n width: 600px;\n margin: 5em auto;\n padding: 50px;\n background-color: #fff;\n border-radius: 1em;\n }\n a:link, a:visited {\n color: #38488f;\n text-decoration: none;\n }\n @media (max-width: 700px) {\n body {\n background-color: #fff;\n }\n div {\n width: auto;\n margin: 0 auto;\n border-radius: 0;\n padding: 1em;\n }\n }\n </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n <p>This domain is established to be used for illustrative examples in documents. You may use this\n domain in examples without prior coordination or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n"
string_response.class
# => String
string_response.kind_of? Net::HTTPSuccess
# => false
status_response = Net::HTTP.get_response(url)
# => #<Net::HTTPOK 200 OK readbody=true>
status_response.class
# => Net::HTTPOK
status_response.kind_of? Net::HTTPSuccess
# => true

