我正在我的 Web 应用程序中实现对 MailChimp API 的 API 调用。但是这个问题对于任何接受简单 HTTP GET 的 API 调用都是有效的。
我想捕捉任何错误并允许我的应用程序继续运行,即使 API 调用失败、mailchimp 服务器关闭、缓慢或不可用也是如此。
MailChimp API返回一个序列化的 JSON 对象。这是我的代码。
def listSubscribe = { apiurl, apikey, listid, email ->
def url = "${apiurl}?method=listSubscribe&apikey=${apikey}&id=${listid}&email_address=${email}"
}
try {
def url = new URL(listSubscribe(apiUrl,apiKey,listId,email))
return (url.text == 'true') ? true : false
} catch (MalformedURLException e) {
return false
} catch (java.net.UnknownHostException e) {
return false
}
我应该执行任何其他尝试/捕获吗?如何改进我的代码以使其更安全地处理不可访问的 API 调用?
解决方案
为了使调用异步,并且由于我在 Grails 应用程序中使用此代码,我创建了一个Quartz 作业来执行包含 API 调用的服务。
class MailChimpListSubscribeJob {
def mailChimpService
def execute(context) {
mailChimpService.listSubscribe(context.mergedJobDataMap.get('email'))
}
}
该服务现在使用超时并捕获通用异常:
class MailChimpService {
def grailsApplication
def listSubscribe(email_address) {
def apiurl = grailsApplication.config.mailchimp.apiUrl
def apikey = grailsApplication.config.mailchimp.apiKey
def listid = grailsApplication.config.mailchimp.listId
listSubscribe(apiurl, apikey, listid, email_address)
}
def listSubscribe(apiurl, apikey, listid, email) {
try {
def cmdurl = "${apiurl}?method=listSubscribe&apikey=${apikey}&id=${listid}&email_address=${email}"
def url = new URL(cmdurl)
def response = url.getText(connectTimeout: 4 * 1000, readTimeout: 4 * 1000)
return (response == 'true') ? true : false
} catch (MalformedURLException e) {
return false
} catch (java.net.UnknownHostException e) {
return false
} catch (Exception e) {
return false
}
}
}
在我的控制器内部:
MailChimpListSubscribeJob.triggerNow([email: 'myemail@example.com'])