Api 考虑到服务器无法访问或停机,如何使用Groovy编写URL HTTP Get?

Api 考虑到服务器无法访问或停机,如何使用Groovy编写URL HTTP Get?,api,http,groovy,Api,Http,Groovy,我正在web应用程序中实现对MailChimp API的API调用。但是这个问题对于任何接受简单HTTP GET的API调用都是有效的 我希望捕获任何错误,并允许我的应用程序继续运行而不会出现问题,即使API调用失败、mailchimp服务器停机、速度慢或不可用 返回序列化的JSON对象。这是我的密码 def listSubscribe = { apiurl, apikey, listid, email -> def url = "${apiurl}?method=listSubs

我正在web应用程序中实现对MailChimp API的API调用。但是这个问题对于任何接受简单HTTP GET的API调用都是有效的

我希望捕获任何错误,并允许我的应用程序继续运行而不会出现问题,即使API调用失败、mailchimp服务器停机、速度慢或不可用

返回序列化的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应用程序中使用了这段代码,所以我创建了一个用于执行包含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'])

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

  • 如果您在几秒钟内没有从他们的系统收到任何响应,请启用此调用的超时。这将在系统响应缓慢或脱机时处理事件
  • <> LI>如果不是一个关键的调用,它决定您是否可以继续执行代码的其余部分,那么您也应该考虑使它异步。
  • 如果您想要处理任何可能发生的不可预见的运行时异常,还可以捕获泛型异常

  • 如何使用URL类启用超时?我是否需要使用http builder之类的类?查看此博客:感谢您提供解释超时的链接