0

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'])
4

1 に答える 1

1

セルジオ-次のことも行うことができます。

  1. 数秒以内にシステムから応答がない場合に備えて、この呼び出しでタイムアウトを有効にします。これにより、システムの応答が遅い場合やオフラインの場合にイベントが処理されます。
  2. 残りのコード実行を続行できるかどうかを決定する重要な呼び出しではない場合は、非同期にすることも検討する必要があります。
  3. 発生する可能性のある予期しないランタイム例外を処理する場合に備えて、一般的な例外もキャッチします。
于 2012-06-14T13:34:22.633 に答える