在我的 RAILS 控制器中处理第三方 API 400/500 响应
Handling third party API 400/500 responses in my RAILS controllers
我正在学习如何将第三方 API 应用到我的 rails 应用程序中,但在处理错误响应时遇到困难。
更具体地说,我正在尝试实施 Full Contact API with the gem fullcontact-api-ruby。我已经使用 API 密钥解决了身份验证问题,并使用 gem 方法通过控制台发出了一些请求,没有任何问题。
我现在正尝试在配置文件控制器中使用 API 包装器方法。想法是:
- 向控制器发送电子邮件作为参数
- 完整联系人 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 响应。
你可以做到
rescue FullContact::NotFound
为了挽救那个错误。
看起来错误并没有让您进行比较。即便如此,你的比较是有缺陷的。由于您要将其转换为字符串,因此需要将其与字符串进行比较
改变
if @intel[:status].to_s[0] != 2
进入
if @intel[:status].to_s[0] != '2'
rescue
块的想法是定义当您从错误中解救出来时发生的操作。
构建方法的正确方法是...
def create
@intel = FullContact.person(email: params[:email])
# Code to create and populate a Profile instance
rescue FullContact::NotFound
flash[:error] = "Can't process request try again later"
redirect_to profiles_path
end
出现在rescue
之后的代码在被救出时执行,否则忽略。
格式为
begin
# normal code which may or may not encounter a raised error, if no
# raised error, it continues to normal completion
rescue
# code that is only executed if there was a rescued error
ensure
# code that always happens, regardless of rescue or not, could be
# used to ensure necessary cleanup happens even if an exception raised
end
方法本身就是一个完整的 begin
块,因此不需要上述格式大纲中的 begin
和 end
。
您不需要 ensure
块,只是添加它以表明存在该功能。也可以将 else
与 rescue
一起使用,但那是另一天的事:)
我正在学习如何将第三方 API 应用到我的 rails 应用程序中,但在处理错误响应时遇到困难。
更具体地说,我正在尝试实施 Full Contact API with the gem fullcontact-api-ruby。我已经使用 API 密钥解决了身份验证问题,并使用 gem 方法通过控制台发出了一些请求,没有任何问题。
我现在正尝试在配置文件控制器中使用 API 包装器方法。想法是:
- 向控制器发送电子邮件作为参数
- 完整联系人 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 响应。
你可以做到
rescue FullContact::NotFound
为了挽救那个错误。
看起来错误并没有让您进行比较。即便如此,你的比较是有缺陷的。由于您要将其转换为字符串,因此需要将其与字符串进行比较
改变
if @intel[:status].to_s[0] != 2
进入
if @intel[:status].to_s[0] != '2'
rescue
块的想法是定义当您从错误中解救出来时发生的操作。
构建方法的正确方法是...
def create
@intel = FullContact.person(email: params[:email])
# Code to create and populate a Profile instance
rescue FullContact::NotFound
flash[:error] = "Can't process request try again later"
redirect_to profiles_path
end
出现在rescue
之后的代码在被救出时执行,否则忽略。
格式为
begin
# normal code which may or may not encounter a raised error, if no
# raised error, it continues to normal completion
rescue
# code that is only executed if there was a rescued error
ensure
# code that always happens, regardless of rescue or not, could be
# used to ensure necessary cleanup happens even if an exception raised
end
方法本身就是一个完整的 begin
块,因此不需要上述格式大纲中的 begin
和 end
。
您不需要 ensure
块,只是添加它以表明存在该功能。也可以将 else
与 rescue
一起使用,但那是另一天的事:)