Skip to main content

リクエストとレスポンス

AI MarketerのバックエンドサーバーはKoaに基づいています。REST APIを通じてリクエストを送信すると、コンテキストオブジェクト(ctx)がAI Marketerのバックエンドの各要素(例:ポリシーコントローラーサービス)に渡されます。

ctxには3つの主要なオブジェクトが含まれています:

  • APIリクエストを行うクライアントによって送信されたリクエストに関する情報のためのctx.request
  • AI Marketerのバックエンド内のリクエストの状態に関する情報のためのctx.state
  • サーバーが返すレスポンスに関する情報のためのctx.response
💡 Tip

リクエストのコンテキストは、コードのどこからでもAI Marketer.requestContext関数を使ってアクセスすることができます。

👀 Info

以下のドキュメンテーションで説明されている概念とパラメーターに加えて、KoaリクエストドキュメンテーションKoaルータードキュメンテーションKoaレスポンスドキュメンテーションで追加の情報を見つけることができるかもしれません。

リクエストとレスポンスが強調表示されたシンプルなAI Marketerバックエンドダイアグラム
この図は、リクエストとレスポンスが強調表示されたAI Marketerバックエンドを通るリクエストのシンプルなバージョンを表しています。バックエンドカスタマイズの導入ページには、完全なインタラクティブな図が含まれています。

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.ipsX-Forwarded-Forが存在し、app.proxyが有効になっている場合、上流から下流への順番でIPの配列が返されます。

例えば、その値が "client, proxy1, proxy2" の場合、["client", "proxy1", "proxy2"] の配列を受け取ります。
Array
ctx.request.methodリクエストメソッド(例:GETPOST)。String
ctx.request.origin最初の / の前のURL部分。String
ctx.request.paramsURLに送信されたパラメータ。

例えば、内部URLが /restaurants/:id の場合、実際のリクエストで :id を置き換えたものが ctx.request.params.id を通じてアクセス可能になります。
Object
ctx.request.pathクエリパラメータを除いた、リクエストされたリソースのパス。String
ctx.request.protocol使用されているプロトコル(例:https または http)。String
ctx.request.queryAI Marketer固有のクエリパラメータObject
ctx.request.subdomainsURLに含まれるサブドメイン。

例えば、ドメインが 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.hrefhttps://example.com:1337/api/restaurants?id=123
ctx.request.protocolhttps
ctx.request.hostlocalhost:1337
ctx.request.hostnamelocalhost
ctx.request.originhttps://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.query
ctx.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.locale1つまたは複数のロケールを選択するパラメータString or Array

ctx.state

ctx.stateオブジェクトは、AI Marketerバックエンド内のリクエストの状態にアクセスを提供し、userauthenticationrouteについての特定の値を含みます:

パラメータ説明
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.infoapiNameや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.messageresponse.statusと関連付けられています。
String
ctx.response.header
ctx.response.headers
レスポンスと共に送信されるヘッダー。Object
ctx.response.lengthContent-Length ヘッダーの値を数値化したもの、または可能な場合は ctx.bodyから推測したもの;それ以外の場合は undefinedを返します。Integer
ctx.response.redirect
ctx.response.redirect(url, [alt])
URLへの302リダイレクトを実行します。文字列の "back" は特別に処理されて、リファラーのサポートを提供します。リファラーが存在しない場合は、altまたは "/" が使用されます。

例: ctx.response.redirect('back', '/index.html');
Function
ctx.response.attachment

ctx.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);
},
};

例:

./api/test/content-types/article/lifecycles.js

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の機能を使用しています。
:::