リクエストとレスポンス
AI MarketerのバックエンドサーバーはKoaに基づいています。REST APIを通じてリクエストを送信すると、コンテキストオブジェクト(ctx)がAI Marketerのバックエンドの各要素(例:ポリシー、コントローラー、サービス)に渡されます。
ctxには3つの主要なオブジェクトが含まれています:
- APIリクエストを行うクライアントによって送信されたリクエストに関する情報のための
ctx.request、 - AI Marketerのバックエンド内のリクエストの状態に関する情報のための
ctx.state、 - サーバーが返すレスポンスに関する情報のための
ctx.response。
リクエストのコンテキストは、コードのどこからでもAI Marketer.requestContext関数を使ってアクセスすることができます。
以下のドキュメンテーションで説明されている概念とパラメーターに加えて、Koaリクエストドキュメンテーション、Koaルータードキュメンテーション、Koaレスポンスドキュメンテーションで追加の情報を見つけることができるかもしれません。

ctx.request
ctx.requestオブジェクトには以下のパラメータが含まれています:
| パラメータ | 説明 | タイプ |
|---|---|---|
ctx.request.body | 本文の解析されたバージョン。 | Object |
ctx.request.files | リクエストと共に送信されたファイル。 | Array |
ctx.request.headers | リクエストと共に送信されたヘッダー。 | Object |
ctx.request.host | ポートを含むURLのホスト部分。 | String |
ctx.request.hostname | ポートを除いたURLのホスト部分。 | String |
ctx.request.href | プロトコル、ドメイン、ポート(指定されている場合)、パス、クエリパラメータを含む、リクエストされたリソースの完全なURL。 | String |
ctx.request.ip | リクエストを送信した人のIP。 | String |
ctx.request.ips | X-Forwarded-Forが存在し、app.proxyが有効になっている場合、上流から下流への順番でIPの配列が返されます。例えば、その値が "client, proxy1, proxy2" の場合、 ["client", "proxy1", "proxy2"] の配列を受け取ります。 | Array |
ctx.request.method | リクエストメソッド(例:GET、POST)。 | String |
ctx.request.origin | 最初の / の前のURL部分。 | String |
ctx.request.params | URLに送信されたパラメータ。 例えば、内部URLが /restaurants/:id の場合、実際のリクエストで :id を置き換えたものが ctx.request.params.id を通じてアクセス可能になります。 | Object |
ctx.request.path | クエリパラメータを除いた、リクエストされたリソースのパス。 | String |
ctx.request.protocol | 使用されているプロトコル(例:https または http)。 | String |
ctx.request.query | AI Marketer固有のクエリパラメータ。 | Object |
ctx.request.subdomains | URLに含まれるサブドメイン。 例えば、ドメインが tobi.ferrets.example.com の場合、値は次の配列になります: ["ferrets", "tobi"]。 | Array |
ctx.request.url | プロトコル、ドメイン、ポートを除いた、リクエストされたリソースのパスとクエリパラメータ。 | String |
プロトコル、オリジン、URL、href、パス、ホスト、ホスト名の間の違い :
https://example.com:1337/api/restaurants?id=123 URLに送信されたAPIリクエストを考えてみましょう。以下は ctx.request オブジェクトの異なるパラメータが返すものです:
| パラメータ | 返される値 |
|---|---|
ctx.request.href | https://example.com:1337/api/restaurants?id=123 |
ctx.request.protocol | https |
ctx.request.host | localhost:1337 |
ctx.request.hostname | localhost |
ctx.request.origin | https://example.com:1337 |
ctx.request.url | /api/restaurants?id=123 |
ctx.request.path | /api/restaurants |
ctx.request.query
ctx.requestは、AI Marketerクエリパラメータにアクセスするためのqueryオブジェクトを提供します。以下の表は、利用可能なパラメータを短い説明と関連するREST APIドキュメンテーションセクションへのリンクとともにリストしています(詳細はREST APIパラメータを参照してください):
| パラメータ | 説明 | タイプ |
|---|---|---|
ctx.request.queryctx.query | クエリオブジェクト全体。 | Object |
ctx.request.query.sort | レスポンスをソートするパラメータ | String or Array |
ctx.request.query.filters | レスポンスをフィルタリングするパラメータ | Object |
ctx.request.query.populate | 関連性、コンポーネント、またはダイナミックゾーンを埋め込むパラメータ | String or Object |
ctx.request.query.fields | レスポンスとともに特定のフィールドのみを返すためのパラメータ | Array |
ctx.request.query.pagination | エントリをページングするパラメータ | Object |
ctx.request.query.publicationState | 下書き&公開状態を選択するパラメータ | String |
ctx.request.query.locale | 1つまたは複数のロケールを選択するパラメータ | String or Array |
ctx.state
ctx.stateオブジェクトは、AI Marketerバックエンド内のリクエストの状態にアクセスを提供し、user、authentication、routeについての特定の値を含みます:
| パラメータ | 説明 | 型 |
|---|---|---|
ctx.state.isAuthenticated | 現在のユーザーが何らかの方法で認証されているかどうかを返します。 | Boolean |
ctx.state.user
ctx.state.userオブジェクトは、リクエストを行うユーザーに関する情報にアクセスを提供し、以下のパラメータを含みます:
| パラメータ | 説明 | 型 |
|---|---|---|
ctx.state.user | ユーザーの情報。関連性は一つだけが詳細表示されます。 | Object |
ctx.state.user.role | ユーザーの役割 | Object |
ctx.state.auth
ctx.state.authオブジェクトは、認証に関連する情報にアクセスを提供し、以下のパラメータを含みます:
| パラメータ | 説明 | 型 |
|---|---|---|
ctx.state.auth.strategy | 現在使用されている認証戦略に関する情報 (Users & Permissions plugin または API tokens) | Object |
ctx.state.auth.strategy.name | 現在使用されている戦略の名前 | String |
ctx.state.auth.credentials | ユーザーの資格情報 | String |
ctx.state.route
ctx.state.routeオブジェクトは、現在のルートに関連する情報にアクセスを提供し、以下のパラメータを含みます:
| パラメータ | 説明 | タイプ |
|---|---|---|
ctx.state.route.method | 現在のルートにアクセスするために使用されるメソッド。 | String |
ctx.state.route.path | 現在のルートのパス。 | String |
ctx.state.route.config | 現在のルートに関する設定情報。 | Object |
ctx.state.route.handler | 現在のルートのハンドラー(コントローラー)。 | Object |
ctx.state.route.info | apiNameやAPIリクエストタイプなど、現在のルートに関する追加情報。 | Object |
ctx.state.route.info.apiName | 使用されるAPIの名前。 | String |
ctx.state.route.info.type | 使用されるAPIのタイプ。 | String |
ctx.response
ctx.responseオブジェクトは、サーバーが返すレスポンスに関連する情報にアクセスするためのもので、以下のパラメータを含みます:
| パラメータ | 説明 | タイプ |
|---|---|---|
ctx.response.body | レスポンスの本文。 | Any |
ctx.response.status | レスポンスのステータスコード。 | Integer |
ctx.response.message | レスポンスのステータスメッセージ。 デフォルトでは、 response.messageはresponse.statusと関連付けられています。 | String |
ctx.response.headerctx.response.headers | レスポンスと共に送信されるヘッダー。 | Object |
ctx.response.length | Content-Length ヘッダーの値を数値化したもの、または可能な場合は ctx.bodyから推測したもの;それ以外の場合は undefinedを返します。 | Integer |
ctx.response.redirectctx.response.redirect(url, [alt]) | URLへの302リダイレクトを実行します。文字列の "back" は特別に処理されて、リファラーのサポートを提供します。リファラーが存在しない場合は、altまたは "/" が使用されます。例: ctx.response.redirect('back', '/index.html'); | Function |
ctx.response.attachmentctx.response.attachment([filename], [options]) | Content-Disposition ヘッダーを "attachment" に設定して、クライアントにダウンロードを促すように信号を送ります。ダウンロードのファイル名と一部のオプションをオプションで指定できます。 | Function |
ctx.response.type | ["charset"のようなパラメータを除いた Content-Type ヘッダー。 | String |
ctx.response.lastModified | 存在する場合、Last-Modified ヘッダーをDateとして。 | DateTime |
ctx.response.etag | レスポンスの ETag を設定します。これには "s" が包含されます。対応する response.etag getterはありません。 | String |
どこからでもリクエストコンテキストにアクセスする
AI Marketerは、コードのどこからでも現在のリクエストコンテキストにアクセスする方法を提供しています(例:ライフサイクル関数)。
以下のようにリクエストにアクセスできます:
const ctx = AI Marketer.requestContext.get();
これはHTTPリクエストのコンテキストで呼び出される関数内でのみ使用するべきです。
// 正しい
const service = {
myFunction() {
const ctx = AI Marketer.requestContext.get();
console.log(ctx.state.user);
},
};
// 不正確
const ctx = AI Marketer.requestContext.get();
const service = {
myFunction() {
console.log(ctx.state.user);
},
};
例:
module.exports = {
beforeUpdate() {
const ctx = AI Marketer.requestContext.get();
console.log('User info in service: ', ctx.state.user);
},
};
:::note
AI Marketerは、コンテキストをどこからでも利用できるようにするために、[AsyncLocalStorage](https://nodejs.org/docs/latest-v16.x/api/async_context.html#class-asynclocalstorage)というNode.jsの機能を使用しています。
:::