このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
HTTP リクエスト内のカスタムのルートとペイロードの処理
MATLAB® Production Server™ では、デプロイされた MATLAB 関数を Web リクエスト ハンドラーとして使用できます。これらのハンドラーを使用してリクエストやルートのマッピングのカスタマイズが可能です。
MATLAB Production Server の Web リクエスト ハンドラーは、柔軟なクライアント/サーバー通信を提供します。
クライアント プログラマは、RESTful リクエスト内のカスタムの HTTP ヘッダーとペイロードをサーバーに送信できます。
サーバー管理者は、デプロイされた MATLAB 関数にリクエスト URL を柔軟にマッピングできます。
サーバー管理者は、静的ファイル サービスを提供できます。
MATLAB のプログラマは、カスタムの HTTP ハンドラー、HTTP ステータス コード、HTTP ステータス メッセージ、およびペイロードを MATLAB Production Server にデプロイされた関数で返すことができます。
Web リクエスト ハンドラーを作成するには、リクエストのデータを受け入れて返す MATLAB 関数を記述し、それをサーバーにデプロイします。次に、サーバー上の JSON ファイル、その関数を含むデプロイされたアーカイブにパッケージ化された JSON ファイル、またはその両方のファイルで、その関数へのカスタムの URL ルートを指定します。
Web リクエスト ハンドラーの MATLAB 関数の記述
サーバーにデプロイする MATLAB 関数が Web リクエスト ハンドラーとして機能するためには、1 つのスカラー構造体配列を入力として受け入れて、1 つのスカラー構造体配列を出力として返す必要があります。
関数の入力引数の構造体は、クライアント リクエストに関する情報を提供します。それらのリクエストで、クライアントはカスタム HTTP ヘッダーとカスタム ペイロードを送信できます。デプロイされた関数が受け入れることができるペイロードに関して、データ形式の制限はありません。たとえば、関数は、MATLAB Production Server RESTful API で指定されたスキーマではないバイナリ形式、ASCII 形式、CSV データ、または JSON データで生データを受け入れることができます。また、クライアントは Transfer-Encoding: chunked
ヘッダーを使用してデータをチャンクで送信できます。チャンク化された転送エンコードでは、サーバーはペイロードをチャンクで受信しますが、入力構造体はペイロード データ全体を受信します。
関数の入力引数の構造体には、以下のフィールドが含まれます。
フィールド名 | データ型 | 次元 | 説明 |
---|---|---|---|
ApiVersion | double | 1 行 3 列 | 形式 <major> <minor> <fix> での入力構造体スキーマのバージョン |
Body | uint8 | 1 行 N 列 | リクエストのペイロード |
Headers | cell | N 行 2 列 | HTTP リクエスト ヘッダー cell 配列内の各要素はヘッダーを表します。各要素はキーと値のペアです。ここで、キーは |
HttpVersion | double | 1 行 2 列 | 形式 <major> <minor> での HTTP バージョン |
Method | char | 1 行 N 列 | HTTP リクエスト メソッド |
Path | char | 1 行 N 列 | リクエスト URL のパス |
デプロイされた MATLAB 関数は RESTful リクエスト内のカスタムのヘッダーとペイロードを受け入れることができるため、リクエスト ヘッダーのデータに応じて MATLAB 関数の動作を変化させることができます。関数の出力引数の構造体を使用して、レスポンスをカスタムの HTTP ヘッダーとペイロードで返すことができます。サーバー処理エラーがある場合は、設定したカスタム HTTP ヘッダーがオーバーライドされます。MATLAB エラーが発生した場合、サーバーは HTTP 500 Internal Server Error
レスポンスを返します。構造体内のフィールドはすべてオプションです。
出力引数の構造体には、以下のフィールドを含めることができます。
フィールド名 | データ型 | 次元 | 説明 |
---|---|---|---|
ApiVersion | double | 1 行 3 列 | 形式 <major> <minor> <fix> での出力構造体スキーマのバージョン |
Body | uint8 | 1 行 N 列 | レスポンスのペイロード |
Headers | cell | N 行 2 列 | HTTP レスポンスヘッダー cell 配列内の各要素はヘッダーを表します。各要素はキーと値のペアです。ここで、キーは |
HttpCode | double | 1 行 1 列 | HTTP ステータス コード |
HttpMessage | char | 1 行 N 列 | HTTP ステータス メッセージ |
URL ルートの構成
カスタムの URL ルートを使用すると、サーバーはリクエスト URL 内のパスを、デプロイ可能なアーカイブおよびサーバー上にデプロイされた MATLAB 関数にマッピングできます。URL ルートは、サーバー インスタンス レベルまたはデプロイ可能なアーカイブ レベルで定義できます。
"インスタンスレベルのルート" — URL ルートをサーバー インスタンス上の単一の JSON ファイルで定義します。これらのルートは、サーバーにデプロイされたすべてのアーカイブの Web ハンドラー関数にリクエスト URL をマッピングします。 (R2022a 以降)
"アーカイブ固有のルート" — 個々のアーカイブの URL ルートをそれぞれの JSON ファイル内で定義し、そのファイルをアーカイブにパッケージ化します。これらのルートは、サーバー上のそのアーカイブ内で定義された Web ハンドラー関数にのみリクエスト URL をマッピングします。アーカイブ固有のルートを使用すると、より適切にルートを整理し、ルートの一致の競合を回避できます。 (R2023b 以降)
これらのルートは組み合わせて定義でき、どちらのタイプのルートもオプションです。
インスタンスレベルのルートの構成
R2022a 以降
デプロイされた MATLAB 関数へのリクエスト URL のマッピングをサーバー インスタンス レベルで指定するには、サーバー上の JSON ファイルを使用できます。既定のファイル名は routes.json
で、その既定の場所は
フォルダー内です。$MPS_INSTALL
/configmain_config
サーバー構成ファイルで routes-file
プロパティの値を変更すると、このファイル名とその場所を変更できます。routes.json
を更新した後で、サーバーを再起動する必要があります。
サーバーは、起動時に routes.json
ファイルを読み取るように試みます。ファイルが存在しない場合や、ファイルにエラーが含まれている場合、サーバーは開始せず、log-root
プロパティで指定されているフォルダー内の main.log
ファイルにエラー メッセージが書き込まれます。
既定の routes.json
ファイルには、値が 1.0.0
の version
フィールドと空の pathmap
フィールドが含まれます。version
では、ファイルのスキーマ バージョンが指定されます。その値を変更する必要はありません。カスタムのルートを許可するには、ファイルを編集して pathmap
配列でマッピング ルールを指定します。配列の各オブジェクトが URL ルートに対応します。
インスタンスレベルのルート JSON ファイルのスキーマは次のとおりです。
{ "version": "1.0.0", "pathmap": [ { "match": "<regular_expression>", "webhandler": { "component": "<name_of_deployable_archive>", "function": "<name_of_deployed_function>" } }, { "match": "<regular_expression>", "webhandler": { "component": "<name_of_deployable_archive>", "function": "<name_of_deployed_function>" } } ] } |
URL マッピング ルールを指定するには、pathmap
配列の match
フィールドおよび webhandler
フィールドを使用します。
クライアント リクエスト URL は、
http://
のようにホスト名とポートの後にスラッシュが含まれている場合のみルートと一致します。host
:port
/match
フィールドで、リクエスト URL 内のパスに一致するように、ECMAScript 文法を使用する正規表現を指定します。リクエスト URL が
match
フィールド内の複数の正規表現と一致する場合、ファイルの先頭から開始して最初の一致が選択されます。そのため、より具体的なパターンからより一般的なパターンの順にパターン一致を指定します。リクエスト URL の部分文字列が一致である場合、正規表現パターンは一致であるとみなされます。たとえば、パターン
a/b
はa/b
、/a/b
、および/x/a/b/y
と一致します。ただし、正規表現アンカーである^
および$
を使用して、特定の文字の前または後の位置と一致させることができます。たとえば、パターン^a/b$
はa/b
のみと一致します。リクエスト URL 内のクエリ パラメーターと一致する正規表現を指定できます。たとえば、
^/clientrequest($|\\W+)
は/clientrequest
と一致し、さらに/clientrequest
に語以外の文字と 1 つ以上の追加の文字が続く/clientrequest?foo=bar
などとも一致します。語以外の文字の表現\\W
には、JSON をエスケープするために追加のバックスラッシュが必要です。MATLAB Production Server RESTful API を使用する非同期リクエスト実行はサポートされていません。リクエスト実行は同期です。MATLAB Production Server RESTful API の詳細については、MATLAB 関数実行のための RESTful APIを参照してください。
webhandler
フィールドで、component
フィールドを使用して、デプロイ可能なアーカイブの名前を指定し、function
フィールドを使用して、リクエスト URL が実行するデプロイされた関数の名前を指定します。
アーカイブ固有のルートの構成
R2023b 以降
アーカイブ固有のルートを使用すると、デプロイ可能なアーカイブの名前でルートを整理し、インスタンスレベルのルート JSON ファイルですべてのルートを指定する場合に発生する可能性がある潜在的なルートの一致の競合を回避できます。
アーカイブ固有のルートを使用するには、MATLAB Production Server R2023b 以降と MATLAB Runtime R2023b 以降が必要です。
メモ
クライアント リクエスト URL が
routes-file
構成プロパティで指定されたインスタンスレベルのルート JSON ファイルとアーカイブ固有のルート ファイルの両方のルートと一致する場合、インスタンスレベルのルートが優先されます。アーカイブ固有のルートを定義する場合は、サーバー インスタンスにインスタンスレベルのルート JSON ファイルが (そのファイルでいずれのルートも指定しない場合でも) 含まれていなければなりません。このファイルを削除したり、
routes-file
構成プロパティをコメントアウトしたりしないでください。
アーカイブ固有のルート用のルート JSON ファイルのスキーマは次のとおりです。
{ "version": "1.0.0", "pathmap": [ { "match": "<regular_expression>", "webhandler": { "function": "<name_of_deployed_function>" } }, { "match": "<regular_expression>", "webhandler": { "function": "<name_of_deployed_function>" } } ] } |
このスキーマは、デプロイ可能なアーカイブを指定する component
フィールドがオプションであることを除き、インスタンスレベルのルート用に定義するものと同じです。このフィールドを指定する場合、空の文字列 (""
) またはデプロイ可能なアーカイブの名前 (.ctf
拡張子は除く) のみを入力として受け入れます。
たとえば、アーカイブ ファイル myarchive.ctf
にパッケージ化されたルートについて、以下の webhandler
の指定はいずれも有効であり等価です。
"webhandler": { "function": "myfunction", "component": "myarchive" }
"webhandler": { "function": "myfunction", "component": "" }
"webhandler": { "function": "myfunction" }
pathmap
オブジェクトを変更せずに、インスタンスレベルのルート JSON ファイルで定義されたルートをアーカイブ固有のルート ファイルに切り替えるには、component
フィールドを使用します。
アーカイブ固有のルートは、インスタンスレベルのルートと同様の一致ルールに従います。ただし、一致は 2 番目のパス区切り記号から始まり、クライアント リクエスト URL にスラッシュが続くアーカイブ名が含まれている場合のみ一致する可能性があります。
http://host:port/archive_name/
インスタンスレベルのルート JSON ファイルをデプロイ可能なアーカイブにパッケージ化するには、compiler.build.productionServerArchive
(MATLAB Compiler SDK) の RoutesFile
オプションを使用します。
compiler.build.productionServerArchive({mfilename1 mfilename2 ... mfilenameN}, ... ArchiveName='archive_name', ... RoutesFile='ArchiveRoutes.json')
mcc
(MATLAB Compiler) の ROUTES
構文を使用します。 mcc -U -W 'CTF:archive_name,ROUTES:ArchiveRoutes.json' mfilename1 mfilename2 ... mfilenameN
— 作成するデプロイ可能なアーカイブの名前。例:archive_name
myarchive
。
— アーカイブ固有のルートを含む JSON ファイルの絶対パスまたは相対パス。例:ArchiveRoutes.json
myarchive_routes.json
。
— デプロイ可能なアーカイブにパッケージ化する MATLAB 関数ファイル (スペースで区切ります)。例:mfilename1 mfilename2 ... mfilenameN
myfunction1.m myfunction2.m
。
インスタンスレベルのルートを使用した Web リクエスト ハンドラーのデプロイ
R2022a 以降
この例では、サーバー インスタンスにデプロイされたすべてのアーカイブにわたり、定義済みの URL ルートのマッピングを適用する、Web リクエスト ハンドラーのデプロイ方法を示します。
前提条件
サーバー インスタンスは既定のホストとポート
localhost:9910
で実行します。サーバーの起動の詳細については、Start Server Instance Using Command Lineを参照してください。routes-file
構成プロパティで指定された既定のインスタンスレベルのルート JSON ファイルをサーバー インスタンスで使用します。既定のルート JSON ファイルの場所は$MPS_INSTALL/config/route.json
です。auto-deploy-root
構成プロパティで指定された既定の自動デプロイ フォルダーをサーバー インスタンスで使用します。既定の自動デプロイ フォルダーの場所は$MPS_INSTALL/auto_deploy
です。
Web ハンドラー関数の記述
Web リクエスト ハンドラーとして機能する 3 つの MATLAB 関数を記述します。これらの関数では、リクエストのヘッダーと本文に関する情報を提供するフィールドをもつ入力引数の構造体 request
を使用します。また、それぞれの関数で、成功の HTTP コード、ステータス メッセージ、カスタム ヘッダー、およびメッセージ本文を含むフィールドをもつ構造体 response
を作成して返します。
次の関数は、レスポンスの本文で
"Hello,
というテキストを返します。ここで、name
"
はリクエスト URL のクエリ パラメーターで提供される値です。たとえば、name
?name=MathWorks
です。この関数のコードをhelloNameHandler.m
という名前のファイルに保存します。function response = helloNameHandler(request) params = extractAfter(request.Path,"?"); name = extractBetween(params,"name=",regexpPattern("($|&)")); data = char(sprintf("Hello, %s", name{1})); response = struct( ... 'ApiVersion',[1 0 0], ... 'HttpCode',200, ... 'HttpMessage','OK', ... 'Headers', {{'Server' 'WebFunctionTest/1'; ... 'X-MyHeader' 'foobar'; ... 'X-Request-Body-Len' sprintf('%d', length(request.Body)); ... 'Content-Type' 'text/plain';}}, ... 'Body', unicode2native(data,'ISO-8859-1')); end
次の関数は、
"Hello, World"
というテキストを表示します。この関数のコードをhelloWorldHandler.m
という名前のファイルに保存します。function response = helloWorldHandler(request) data = 'Hello, World'; response = struct( ... 'ApiVersion',[1 0 0], ... 'HttpCode',200, ... 'HttpMessage','OK', ... 'Headers', {{'Server' 'WebFunctionTest/1'; ... 'X-MyHeader' 'foobar'; ... 'X-Request-Body-Len' sprintf('%d', length(request.Body)); ... 'Content-Type' 'text/plain';}}, ... 'Body', unicode2native(data,'ISO-8859-1')); end
次の関数は、既定のハンドラーとして動作し、他のルートに関する情報を提供します。この関数のコードを
defaultHandler.m
という名前のファイルに保存します。function response = defaultHandler(request) data = 'Use routes /hello and /hello?name=<yourname>.'; response = struct( ... 'ApiVersion',[1 0 0], ... 'HttpCode',200, ... 'HttpMessage','OK', ... 'Headers', {{'Server' 'WebFunctionTest/1'; ... 'X-MyHeader' 'foobar'; ... 'X-Request-Body-Len' sprintf('%d', length(request.Body)); ... 'Content-Type' 'text/plain';}}, ... 'Body', unicode2native(data,'ISO-8859-1')); end
Web ハンドラー関数のパッケージ化
compiler.build.productionServerCompiler
または mcc
コマンドを使用して、3 つの関数をデプロイ可能なアーカイブにパッケージ化します。デプロイ可能なアーカイブを作成するその他の方法については、MATLAB Production Server 用のデプロイ可能なアーカイブの作成を参照してください。
helloNameHandler.m
とhelloWorldHandler.m
をhello.ctf
という名前のデプロイ可能なアーカイブにパッケージ化します。compiler.build.productionServerArchive({'helloNameHandler.m','helloWorldHandler.m'},... 'ArchiveName','hello');
mcc -U -W 'CTF:hello' helloNameHandler.m helloWorldHandler.m
defaultHandler.m
をdefault.ctf
という名前のデプロイ可能なアーカイブにパッケージ化します。compiler.build.productionServerArchive({'defaultHandler.m'},... 'ArchiveName','default');
mcc -U -W 'CTF:default' defaultHandler.m
Web ハンドラー関数のデプロイ
アーカイブ hello.ctf
と default.ctf
を $MPS_INSTALL/auto_deploy
フォルダーにコピーしてサーバー インスタンスにデプロイします。サーバー インスタンスにアーカイブをデプロイする他の方法については、MATLAB Production Server へのアーカイブのデプロイを参照してください。
インスタンスレベルのルートの構成
$MPS_INSTALL/config
フォルダーで、デプロイされた関数にクライアント リクエストをマッピングするように routes.json
ファイルを更新します。既存の JSON を以下に置き換えます。
{ "version": "1.0.0", "pathmap": [ { "match": "^/hello\\?name=(\\w+|$)", "webhandler": { "component": "hello", "function": "helloNameHandler" } }, { "match": "^/hello$", "webhandler": { "component": "hello", "function": "helloWorldHandler" } }, { "match": "^/", "webhandler": { "component": "default", "function": "defaultHandler" } } ] } |
ルート
"^/hello\\?name=(\\w+|$)"
は、"localhost:9910/hello?name=
の形式のリクエスト URL を関数name
"helloNameHandler
にマッピングします。ルート
"^/hello$"
は、"localhost:9910/hello"
の形式のリクエスト URL を関数helloWorldHandler
にマッピングします。ルート
"^/"
は、スラッシュを含むリクエスト URL (たとえば、"localhost:9910/"
、"localhost:9910/goodbye"
、"localhost:9910/a/b/c"
) を関数defaultHandler
にマッピングします。
変更を有効にするために、サーバー インスタンスを再起動します。mps-restart
を参照してください。
Web ハンドラー関数へのクライアント リクエストの送信
cURL
や Web ブラウザーなどの任意のクライアントを使用して、デプロイされた関数に HTTP リクエストを送信します。
次のコマンドでは、cURL
を使用して、デプロイされた関数の 1 つをシステムのコマンド ラインから呼び出しています。出力には、本文のテキストとカスタム ヘッダーを含むレスポンスに関する情報が含まれます。
curl -v http://localhost:9910/hello?name=MathWorks
* Trying 127.0.0.1:9910... * Connected to localhost (127.0.0.1) port 9910 (#0) > GET /hello?name=MathWorks HTTP/1.1 > Host: localhost:9910 > User-Agent: curl/8.0.1 > Accept: */* > < HTTP/1.1 200 OK < Server: WebFunctionTest/1 < X-MyHeader: foobar < X-Request-Body-Len: 0 < Content-Type: text/plain < Content-Length: 16 < Connection: Keep-Alive < Hello, MathWorks* Connection #0 to host localhost left intact
次の表に、試すことができる追加のリクエスト URL の例とそれらが一致するルートを示します。
リクエスト URL | 一致の動作 |
---|---|
http://localhost:9910/ | ルート エントリ "^/" と一致します。 |
http://localhost:9910/hello | ルート エントリ "^/hello" と一致します。 |
http://localhost:9910/hello2 | ルート エントリ "^/" と一致しますが、リクエスト URL が文字列 "hello" で終わっていないため "^/hello$" とは一致しません。 |
http://localhost:9910/hello?name=MathWorks | ルート エントリ "^/hello\\?name=(\\w+|$)" と一致します。 |
http://localhost:9910/hello?foo=bar&name=MathWorks | ルート エントリ "^/" と一致しますが、リクエスト URL で name クエリ パラメーターしか指定できないため "^/hello\\?name=(\\w+|$)" とは一致しません。 |
アーカイブ固有のルートを使用した Web リクエスト ハンドラーのデプロイ
R2023b 以降
この例では、サーバーにデプロイされた特定のアーカイブにのみ URL ルートのマッピングを適用する Web リクエスト ハンドラーのデプロイ方法を示します。
前提条件
サーバー インスタンスは既定のホストとポート
localhost:9910
で実行します。サーバーの起動の詳細については、Start Server Instance Using Command Lineを参照してください。routes-file
構成プロパティで指定された既定のインスタンスレベルのルート JSON ファイルをサーバー インスタンスで使用します。既定のルート JSON ファイルの場所は$MPS_INSTALL/config/route.json
です。auto-deploy-root
構成プロパティで指定された既定の自動デプロイ フォルダーをサーバー インスタンスで使用します。既定の自動デプロイ フォルダーの場所は$MPS_INSTALL/auto_deploy
です。
また、この例を実行するには、MATLAB Production Server R2023b 以降と MATLAB Runtime R2023b 以降を使用する必要があります。
Web ハンドラー関数の記述
Web リクエスト ハンドラーとして機能する 2 つの MATLAB 関数を記述します。これらの関数では、リクエストのヘッダーと本文に関する情報を提供するフィールドをもつ入力引数の構造体 request
を使用します。また、それぞれの関数で、成功の HTTP コード、ステータス メッセージ、カスタム ヘッダー、およびメッセージ本文を含むフィールドをもつ構造体 response
を作成して返します。
次の関数は、
"Hello,
というテキストを表示します。ここで、name
"
はリクエスト URL のクエリ パラメーターで提供される値です (たとえばname
?name=MathWorks
)。リクエストにクエリ パラメーターが含まれていない場合、代わりに"Hello"
と表示します。この関数のコードをhelloHandler.m
という名前のファイルに保存します。function response = helloHandler(request) params = extractAfter(request.Path,"?"); name = extractBetween(params,"name=",regexpPattern("($|&)")); if isempty(name) || strcmp(name, "") data = 'Hello'; else data = char(sprintf("Hello, %s", name{1})); end response = struct( ... 'ApiVersion',[1 0 0], ... 'HttpCode',200, ... 'HttpMessage','OK', ... 'Headers', {{'Server' 'WebFunctionTest/1'; ... 'X-MyHeader' 'foobar'; ... 'X-Request-Body-Len' sprintf('%d', length(request.Body)); ... 'Content-Type' 'text/plain';}}, ... 'Body', unicode2native(data,'ISO-8859-1')); end
次の関数は、前の関数と同様ですが、代わりに
"Goodbye,
またはname
""Goodbye"
と表示します。この関数のコードをgoodbyeHandler.m
という名前のファイルに保存します。function response = goodbyeHandler(request) params = extractAfter(request.Path,"?"); name = extractBetween(params,"name=",regexpPattern("($|&)")); if isempty(name) || strcmp(name, "") data = 'Goodbye'; else data = char(sprintf("Goodbye, %s", name{1})); end response = struct( ... 'ApiVersion',[1 0 0], ... 'HttpCode',200, ... 'HttpMessage','OK', ... 'Headers', {{'Server' 'WebFunctionTest/1'; ... 'X-MyHeader' 'foobar'; ... 'X-Request-Body-Len' sprintf('%d', length(request.Body)); ... 'Content-Type' 'text/plain';}}, ... 'Body', unicode2native(data,'ISO-8859-1')); end
Web ハンドラー関数のパッケージ化とデプロイ
関数 helloHandler
と goodbyeHandler
を同じアーカイブにパッケージ化し、それをサーバーにデプロイします。パッケージ化されたアーカイブに、それらの関数への URL ルートを含む JSON ファイルを含めます。
アーカイブ固有の JSON ファイルを作成して、2 つの関数へのルートを定義します。次の JSON を
greet.json
という名前のファイルに保存します。{ "version": "1.0.0", "pathmap": [ { "match": "^/hello$", "webhandler": { "function": "helloHandler" } }, { "match": "^/hello\\?name=(\\w+|$)", "webhandler": { "function": "helloHandler" } }, { "match": "^/goodbye$", "webhandler": { "function": "goodbyeHandler" } }, { "match": "^/goodbye\\?name=(\\w+|$)", "webhandler": { "function": "goodbyeHandler" } } ] }
最初の 2 つのルートは、
"localhost:9910/
" またはarchive_name
/hello"localhost:9910/
の形式のリクエスト URL を関数archive_name
/hello?name=name
"helloHandler
にマッピングします。最後の 2 つのルートは、
"localhost:9910/
" またはarchive_name
/goodbye"localhost:9910/
の形式のリクエスト URL を関数archive_name
/goodbye?name=name
"goodbyeHandler
にマッピングします。
は、次の手順で作成するデプロイ可能なアーカイブの名前です。archive_name
helloHandler.m
とgoodbyeHandler.m
をgreet.ctf
という名前のデプロイ可能なアーカイブにパッケージ化します。関数compiler.build.productionServerArchive
のRoutesFile
またはmcc
コマンドのROUTES
構文を使用して、hello.json
ルート ファイルをアーカイブにパッケージ化します。compiler.build.productionServerArchive({'helloHandler.m', 'goodbyeHandler.m'}, ... ArchiveName='greet', ... RoutesFile='greet.json')
mcc -U -W 'CTF:greet,ROUTES:greet.json' helloHandler.m goodbyeHandler.m
アーカイブ
greet.ctf
をサーバー インスタンスの$MPS_INSTALL/auto_deploy
フォルダーにコピーしてサーバー インスタンスにデプロイします。変更を有効にするためにサーバーを再起動する必要はありません。
Web ハンドラー関数へのクライアント リクエストの送信
cURL
や Web ブラウザーなどの任意のクライアントを使用して、デプロイされた関数に HTTP リクエストを送信します。
次のコマンドでは、cURL
を使用して、デプロイされた関数の 1 つをシステムのコマンド ラインから呼び出しています。出力には、本文のテキストとカスタム ヘッダーを含むレスポンスに関する情報が含まれます。
curl -v http://localhost:9910/greet/hello?name=MathWorks
* Trying 127.0.0.1:9910... * Connected to localhost (127.0.0.1) port 9910 (#0) > GET /hello?name=MathWorks HTTP/1.1 > Host: localhost:9910 > User-Agent: curl/8.0.1 > Accept: */* > < HTTP/1.1 200 OK < Server: WebFunctionTest/1 < X-MyHeader: foobar < X-Request-Body-Len: 0 < Content-Type: text/plain < Content-Length: 16 < Connection: Keep-Alive < Hello, MathWorks* Connection #0 to host localhost left intact
次の表に、試すことができる追加のリクエスト URL の例とそれらが一致するルートを示します。
リクエスト URL | 一致の動作 |
---|---|
http://localhost:9910/greet/hello | ルート エントリ "^/hello$" と一致します。 |
http://localhost:9910/greet/hello?name=MATLAB | ルート エントリ "^/hello\\?name=(\\w+|$)" と一致します。 |
http://localhost:9910/greet/goodbye | ルート エントリ "^/goodbye$" と一致します。 |
http://localhost:9910/greet/goodbye?name=MATLAB | ルート エントリ "^/goodbye\\?name=(\\w+|$)" と一致します。 |
http://localhost:9910/hello | リクエスト URL にアーカイブ名を含むパス セグメントが含まれていないため、いずれのルート エントリとも一致しません。 |