2017年7月末リリースのOpenAPI v3.0.0に入ったCallback Objectという仕様がパッと見だとどう使うかわかりにくかったので、調べてみました。
Callback Objectの仕様は次のリンク先のとおりです。
OpenAPI-Specification/3.0.0.md at master · OAI/OpenAPI-Specification
Callack Objectについて簡単に述べると、「OpenAPIドキュメントで記述しているエンドポイントに対してリクエストしたあと、こちらが指定したエンドポイントに対してリクエスト先がwebhookなどでコールバックするような場合についての仕様が記述できるもの」、です。
まだわかりにくいので、OpenAPI公式のリポジトリに置いてある次のサンプルを見てみます。
まず、このYAML中のキー post
配下を見てみると次のようになっています(抜粋)。
post: description: subscribes a client to receive out-of-band data parameters: - name: callbackUrl in: query required: true description: # ... schema: type: string format: uri example: https://tonys-server.com responses: '201': description: subscription successfully created content: application/json: schema: description: subscription information required: - subscriptionId properties: subscriptionId: description: this unique identifier allows management of the subscription type: string example: 2531329f-fb09-4ef7-887e-84e648214436
ここでは、
/streams
というエンドポイントに対してcallbackUrl
というパラメータとともにPOSTリクエストを投げることができる- リクエストが成功すると
subscription
(購読)リソースが作成される
というエンドポイント仕様が記述されていることがわかります。
parameters
, responses
のさらに下の callbacks
配下にある記述が、今回着目するCallbacks Objectです(抜粋)。
callbacks: onData: '{$request.query.callbackUrl}/data': post: requestBody: description: subscription payload content: application/json: schema: properties: timestamp: type: string format: date-time userData: type: string responses: '202': description: # ... '204': description: # ...
これは、このAPIを提供している側(仕様書内ではAPI providerと呼ばれています)はクライアント側が指定した '{$request.query.callbackUrl}/data'
というURLに対して requestBody
の内容でPOSTリクエストするようになるという記述です。
ここで、$request.query.callbackUrl
のようなデータの指定方法は仕様書の Key Expression
の項に書いてあるURL, HtTPメソッド、HTTPリクエストのデータ、HTTPレスポンスの Location
ヘッダが取得できる「実行時式」(runtime expression) です。
responses
には返すべきステータスコードなどが記述できます。ここでいうエンドポイント '{$request.query.callbackUrl}/data'
を持つホストは responses
に書いた記述を満たすようにレスポンスを返す必要があります。
以上のようにして、Callback Objectを使うことで、あるエンドポイントに付随したAPI provider側からのコールバックについての仕様も記述できるようになります。