.NET で SendGrid API を使う (1)

クロスワープの大鷲です。

SendGrid 編の第 3 回です。
今回は実装寄りの話をします。
API リファレンスをお手元にご用意ください。

.NET でこういったサービスの API を使おうと思うなら、まず NuGet でライブラリを探すのが近道です。
が、残念ながら、今回はこの方法が使えません。
公式のクライアント ライブラリはありますし、第三者の作ったものもいくつかあるのですが、Marketing Campaigns API のサポート状況となると、どのライブラリもあまり親切とは言えません。
そこで今回は自前で作ることにしました。

このライブラリは、いずれ準備が出来たらオープン ソースとして公開したいと考えています。
今しばらくお待ちください……。

構成図

今回はこのような構成で作ってみました。
f:id:cw_owashi:20160602114019p:plain

互換レイヤー

現在利用しているメルマガサービスと、できる限り互換性を保った 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)は、

  1. まず認証なしでリクエストを行い
  2. 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 を使っていきます。

*1:GitHub の API もそうなんですよね。最近の流行りなんでしょうか。RFC では必須とされているのに……。