我正在学习如何在我的 rails 应用程序中实现第三方 API,但正在努力处理错误响应。
更具体地说,我正在尝试使用 gem fullcontact-api-ruby实现Full Contact API。我已经用我的 API 密钥整理了身份验证,并使用 gem 方法通过控制台发出了一些请求,没有问题。
我现在正在尝试在 Profiles Controller 中使用 API 包装器方法。这个想法是:
- 向控制器发送电子邮件作为参数
- Full Contact API 方法“person()”将检索与该电子邮件关联的信息
- 将使用获取的 API 数据创建配置文件对象来填充其属性。
- 如果没有可用于该电子邮件的数据,则存在错误请求或服务器错误,然后将发生闪存错误和重定向。
我开始编写如下代码:
# controllers/profiles_controller.rb
def create
@intel = FullContact.person(email: params[:email])
if @intel[:status].to_s[0] != "2"
flash[:error] = @intel[:status]
redirect_to profiles_path
else
# Code to create and populate a Profile instance
end
由于成功响应的状态代码为 200,我假设我会从 Json 对象中提取代码并检查它是否以 2 开头,在这种情况下,我将继续创建实例。如果响应正常,这种方法就可以工作,因为我可以使用存储在@intel 中的 Json 对象。但是,当响应在 400 秒、500 秒时,Rails 会触发一个异常,导致 Rails 崩溃,不允许我使用任何 JSON 对象:
FullContact::NotFound in ProfilesController#create
GET https://api.fullcontact.com/v2/person.json?apiKey=MY_API_KEY&email=THE_EMAIL_IM_USING_AS_PARAMETER: 404
我显然做错了什么。我已经尝试避免引发的异常,rescue StandardError => e
但我想知道在我的控制器中处理此错误的正确方法是什么。有什么帮助吗?
---更新1尝试史蒂夫解决方案--
如果我在这样的请求之后挽救异常:
def create
@intel = FullContact.person(email: params[:email])
rescue FullContact::NotFound
if @intel.nil?
flash[:error] = "Can't process request try again later"
redirect_to profiles_path
else
# Code to create and populate a Profile instance
end
@intel 设置为 nil(即未设置为响应 JSON 对象)。我想我只是更改条件以检查 @intel 是否为 nil 但是由于某些奇怪的原因,当响应成功并且 @intel 设置为 JSON 对象时,第一个条件不会导致创建对象的方法。即使响应失败,也不确定如何将 @intel 设置为 JSON 响应。