需要使用RestClient来挽救401状态代码

时间:2016-11-03 20:00:28

标签: ruby-on-rails ruby rest-client

我正在使用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异常的任何建议吗?

4 个答案:

答案 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