.NET で SendGrid API を使う (1)
クロスワープの大鷲です。
SendGrid 編の第 3 回です。
今回は実装寄りの話をします。
API リファレンスをお手元にご用意ください。
.NET でこういったサービスの API を使おうと思うなら、まず NuGet でライブラリを探すのが近道です。
が、残念ながら、今回はこの方法が使えません。
公式のクライアント ライブラリはありますし、第三者の作ったものもいくつかあるのですが、Marketing Campaigns API のサポート状況となると、どのライブラリもあまり親切とは言えません。
そこで今回は自前で作ることにしました。
このライブラリは、いずれ準備が出来たらオープン ソースとして公開したいと考えています。
今しばらくお待ちください……。
構成図
今回はこのような構成で作ってみました。
互換レイヤー
現在利用しているメルマガサービスと、できる限り互換性を保った API を構築しました。
これによって、MODD 側ではコードを修正せず、設定ファイルを書き換えるだけで、SendGrid に繋ぐことができるようになりました。
SendGrid Client
SendGrid の API を呼び出すクライアントです。
この部分は、システム内の他の部分に依存しないように作っています。
IMailServiceProvider
将来的に、SendGrid 以外のサービスを利用したくなるかもしれません。
そのような場合でも、互換レイヤー部分を修正しなくても済むように定義したインターフェイスです。
将来的には、他のアプリケーションから、互換レイヤーを経由せず、直接この層を呼び出すことも想定しています。
SendGrid Adapter
IMailServiceProvider を実装するクラスです。
SendGrid Client は独立性を保つために、IMailServiceProvider を実装していないので、間を取り持つためにこのような層を設けています。
SendGrid Webhook
SendGrid からの通知を受け取るための Web エンドポイントです。
受信したデータは一旦キューイングされ、SendGrid Adapter で処理されるようになっています。
認証
SendGrid API の認証には 2 つの方法があります。
API Keys と Basic 認証です。
API Keys は、あらかじめ登録しておいたキーを利用する方法です、
権限を制限できたり、万一キーが漏洩した場合でも無効化すれば被害の拡大を防げますので、API Keys の利用が望ましいと言えるでしょう。
いずれの認証方法を使うにせよ、.NET で HttpClient 等で利用する場合は注意が必要です。
HttpClient(の中で使われている HttpWebRequest)は、
- まず認証なしでリクエストを行い
- 401 Unaurhorized のレスポンスを見て、使用する認証方式を決定する
という処理をしていると思われます(HttpClientHandler や HttpWebRequest では、Credentials プロパティでユーザー名とパスワードは指定できますが、認証方式は指定できません)。
しかし、SendGrid の API は、401 Unauthorized レスポンスを返す際に、利用できる認証方式を示す WWW-Authenticate ヘッダーをつけません。*1
そのため、Credentials プロパティが使えませんので、自分で Authorization ヘッダーをつけてやらなければいけません。
こんな感じです。
var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<api key>");
一旦まとめ
次回は SendGrid API を使っていきます。