0

我正在我的 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'])
4

1 回答 1

1

Sergio - 您可能还需要执行以下操作:

  1. 启用此呼叫超时,以防您在几秒钟内没有从他们的系统得到任何响应。当他们的系统响应缓慢或离线时,这将处理事件。
  2. 如果它不是决定您是否可以继续执行其余代码的关键调用,那么您还应该考虑使其异步。
  3. 如果您想处理可能发生的任何不可预见的运行时异常,也可以捕获通用异常。
于 2012-06-14T13:34:22.633 回答