WebアプリケーションでMailChimpAPIへのAPI呼び出しを実装しています。ただし、この質問は、単純なHTTPGETを受け入れるAPIへのすべての呼び出しに有効です。
エラーをキャッチし、API呼び出しが失敗した場合でも、アプリケーションが問題なく続行できるようにしたいです。mailchimpサーバーがダウンしているか、低速であるか、使用できません。
MailChimpAPIはシリアル化された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
}
他のtry/catchを実行する必要がありますか?どうすればコードを改善して、アクセスできないAPI呼び出しに対してより安全にすることができますか?
解決
呼び出しを非同期にするために、Grailsアプリケーション内でこのコードを使用しているため、API呼び出しを含むサービスを実行するQuartzジョブを作成しました。
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'])