我正在使用Rails gem使用RestClient向api发送请求。我需要救出401错误代码。我在RestClient文档中看到了以下内容:
> RestClient.get('http://my-rest-service.com/resource'){ |response,
> request, result, &block| case response.code when 200
> p "It worked !"
> response when 423
> raise SomeCustomExceptionIfYouWant else
> response.return!(request, result, &block) end }
我试图实施类似的案例陈述:
case response.code
when 200
JSON.parse(response.body)
when 401
raise AuthenicationError, "Unauthorized"
else
raise RestClient::ExceptionWithResponse
end
它捕获200个案件罚款,但忽略401案件并直接到其他地方。有关通过RestClient返回的响应引发401异常的任何建议吗?
答案 0 :(得分:3)
我无法告诉你以及为什么我确定其他客户端回购可以告诉你:)但是使用### max width for each column
tt_content {
# Define max image width of contentelements type=images, for each content column separately
image.20.maxW.cObject = CASE
image.20.maxW.cObject {
key.field = colPos
# 900px - padding (2 x 30px)
default = TEXT
default.value = 840
# normal
0 = TEXT
0 < .default
# left
1 = TEXT
1.value = 165
# right
2 = TEXT
2.value = 155
# 3 border
}
# Define max image width of contentelements type=textWithImages, for each content column separately
/**
* !NOTE:
* This value is simply half the size of tt_content.image.20.maxW.cObject
* Here or otherwise, typoscript prioriCalc can be used to simply halve the values of tt_content.image.20.maxW.
*/
image.20.maxWInText.cObject = CASE
image.20.maxWInText.cObject {
key.field = colPos
default = TEXT
# 1/2 of 900px - padding (2 x 30px)
default.value = 390
# normal
0 = TEXT
0 < .default
# left
1 = TEXT
1.value = 82
# right
2 = TEXT
2.value = 77
# 3 border
}
}
然后用块执行api调用对我有用。
我认为这可能与RestClient内置异常的事实有关。
RestClient::Request.new
答案 1 :(得分:2)
它可以捕获200个案例,但忽略了401个案例并直接进入其他案例。
我宁愿怀疑不去其他地方,实际上;即使你完全取出了else子句,你仍然可以获得RestClient::ExceptionWithResponse
,因为that's what RestClient.get
does when it gets an error response such as in the 400 or 500 range。来自自述文件:
- 对于200到207之间的结果代码,将返回RestClient :: Response
- 对于结果代码301,302或307,如果请求是GET或HEAD,则将遵循重定向
- 对于结果代码303,将遵循重定向并将请求转换为GET
- 对于其他情况,将引发保存Response的RestClient :: ExceptionWithResponse;将针对已知错误代码抛出特定的异常类
- 调用.response来获取服务器响应的异常
答案 2 :(得分:0)
您使用的是错误的HTTP代码。未经授权的实际上是401,而不是410。
答案 3 :(得分:0)
如果您在Request.execute
块中从rescue
捕获了异常,请注意,您还可以从异常中获取响应主体,例如:
def request(method, url, params = {})
resp = RestClient::Request.execute(
method: method,
url: url,
timeout: 30,
accept: :json,
payload: params.to_json,
headers: {
content_type: :json,
}
)
JSON.parse(resp.body)
rescue => e
{ error: e.message, body: JSON.parse(e.response.body) } # <-------------
end