使用ruby的异常处理来读取rest client中的bad request

我们在使用rest-client去发出请求时,result code是200 固然很好,但有时候我们也希望能读取到Exceptions, 例如读取result code是400bad request的response内容,怎么做?

看个例子。

正文

场景:用户A想要通过接口获取到个人信息,代码如下:

 respoonse = RestClient.get 'http://example.com/myprofile?access_token=#{access_token}'
 profile_response = JSON.parse(respoonse.body)

其中,如果access_token过期或者无效,用户希望得到这样的结果:

  • 返回 400 Bad Request
  • 返回一个JSON格式的reponse body ,内容像这样:
{          
   "code": 400,
   "error": {
      "message": "The access token could not be decrypted",
      "type": "OAuthException"
   }
}

这时,如果你的access_token是过期或者无效的,终端运行的时候,会报错400 Bad Request ,但是却没有返回对应的response。

如何解决?

其实,如果你熟悉ruby的异常处理,就会发现很简单,把上述的代码改成如下:

body = begin
  respoonse = RestClient.get 'http://example.com/myprofile?access_token=#{access_token}'
  response.body
rescue RestClient::ExceptionWithResponse  => e
  e.response.body
end

profile_response = JSON.parse(body)

这里,使用了rescue RestClient::ExceptionWithResponse => e 获取异常对象,并赋给了变量e,通过e.response.body来回传需要的error信息。

大功告成。

其实,看到这里,你就明白,不仅仅是 400bad request的response内容可以读取,其他如403 Forbidden,404 not found 等的response内容也是可以依葫芦画瓢来做的。:P

The end

参考: