Cosminexus V9 BPM/ESB基盤 サービスプラットフォーム 解説

[目次][用語][索引][前へ][次へ]

2.13.5 HTTP受付のレスポンス処理

ここでは,HTTP受付に返されたビジネスプロセスからの応答電文が,どのようにHTTPレスポンスへと処理されるかについて説明しています。

HTTPクライアントに応答を返すHTTPレスポンスは次のように分割してHTTP受付内で処理されます。

ステータスライン
HTTPバージョン,ステータスコード,および理由フレーズが格納されます。

HTTPレスポンスヘッダ
HTTPレスポンスのContent-LengthヘッダやContent-Typeヘッダなどの情報が格納されます。

HTTPレスポンスボディ
HTTPクライアントに応答を返すテキストデータまたはバイナリデータが格納されます。
<この項の構成>
(1) ステータスラインの処理
(2) HTTPレスポンスヘッダの処理
(3) HTTPレスポンスボディの処理
(4) ステータスコード

(1) ステータスラインの処理

HTTPレスポンスのステータスラインは,次の形式で出力されます。

 
[HTTPバージョン※1][空白][ステータスコード※2][空白][理由フレーズ]
 

注※1
HTTPバージョンは「HTTP/1.1」で固定です。

注※2
応答電文(ヘッダ)のstatus-code要素の値がステータスコードに設定されます。ステータスコードの詳細は,「(4) ステータスコード」を参照してください。

(2) HTTPレスポンスヘッダの処理

HTTP受付に指定されたすべてのヘッダ情報はHTTPレスポンスヘッダに設定されます。

HTTPレスポンスヘッダの処理について説明します。

(a) Content-Typeとcharset

HTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性は,次の場合によって異なります。

●テキストデータを返す場合
HTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性は,応答電文(ヘッダ)のcontent-type要素,http-header要素,HTTPレスポンスヘッダ定義ファイルなどで設定できます。
応答電文フォーマット(ヘッダ変数用)をビジネスプロセスに設定した場合で,Content-Typeヘッダおよびcharset属性を複数指定したときは,次の表に示すように応答電文フォーマット(ヘッダ変数用)の指定が優先されます。

表2-31 HTTPレスポンスヘッダに使用されるContent-Typeおよびcharset(応答電文フォーマット(ヘッダ変数用)が設定されている場合)

設定項目 応答電文にcontent-type要素が存在する場合※1 応答電文のhttp-header要素にcontent-type要素が存在する場合 応答電文にcontent-type要素およびcharset属性が存在しない場合
content-type要素にcharset属性が存在するとき content-type要素にcharset属性が存在しないとき http-header要素にcharset属性が存在するとき http-header要素にcharset属性が存在しないとき
Content-Typeヘッダ 応答電文のcontent-type要素の値が有効になります。 応答電文のcontent-type要素の値が有効になります。 応答電文のhttp-header要素のcontent-type要素の値が有効になります。※3 応答電文のhttp-header要素のcontent-type要素の値が有効になります。※3 「text/xml」が設定されます。
charset属性 応答電文のcontent-type要素のcharset属性の値が有効になります。※2 HTTP受付定義ファイルの指定値が有効になります。 応答電文のhttp-header要素のcharset属性の値が有効になります。※3 HTTP受付定義ファイルの指定値が有効になります。 HTTP受付定義ファイルの指定値が有効になります。

注※1
要素が存在していても値が空の場合は,要素が存在しないと判断されます。

注※2
属性が存在していても値が空の場合は,属性が存在しないと判断されます。

注※3
応答電文(ヘッダ)のhttp-header要素に複数のcontent-type要素が指定された場合,指定のうちどれか1つの値が有効になります。ただし,どの値が設定されるかは保証されません。

   
また,応答電文フォーマット(ヘッダ変数用)をビジネスプロセスに設定していない場合,次の表に示すように,HTTPレスポンスヘッダ定義ファイルの値が有効になります。

表2-32 HTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性(応答電文フォーマット(ヘッダ変数用)を設定していない場合)

設定項目 HTTPレスポンスヘッダ定義ファイルが存在している場合 HTTPレスポンスヘッダ定義ファイルが存在しない場合
HTTPレスポンスヘッダ定義ファイルにcontent-typeキーが存在するとき HTTPレスポンスヘッダ定義ファイルにcontent-typeキーが存在しないとき
content-typeキーの指定値にcharset属性が存在する content-typeキーの指定値にcharset属性が存在しない HTTPレスポンスヘッダ定義ファイルにcharsetキーが存在しない
Content-Typeヘッダ content-typeキーの指定値が有効になります。 content-typeキーの指定値が有効になります。 「text/xml」が設定されます。 「text/xml」が設定されます。
charset属性 content-typeキーの指定値に存在するcharset属性の値が有効になります。 HTTP受付定義ファイルの指定値が有効になります。 HTTP受付定義ファイルの指定値が有効になります。 HTTP受付定義ファイルの指定値が有効になります。

注※
HTTPレスポンスヘッダ定義ファイルに複数のcontent-typeキーと値のペアを指定した場合,指定のうちどれか1つの値が有効になります。ただし,どの値が設定されるかは保証されません。

   
HTTPレスポンスヘッダ定義ファイルは,HTTP受付定義ファイルから呼び出される任意のファイルです。HTTPレスポンスヘッダ定義ファイルの詳細は,マニュアル「サービスプラットフォーム リファレンス」の「HTTPレスポンスヘッダ定義ファイル」を参照してください。

●ファイルのデータを返す場合
HTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性は,次に示すように応答電文(ヘッダ)のfile要素配下のcontent-type要素で設定できます。

表2-33 HTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性

設定項目 応答電文のfile要素配下にcontent-type要素が存在する場合 応答電文のfile要素配下にcontent-type要素が存在しない場合
file要素配下のcontent-type要素にcharset属性が存在するとき file要素配下のcontent-type要素にcharset属性が存在しないとき
Content-Typeヘッダ 応答電文のfile要素配下のcontent-type要素の値が有効になります。 応答電文のfile要素配下のcontent-type要素の値が有効になります。 設定されません。
charset属性 応答電文のfile要素配下のcontent-type要素のcharset属性の値が有効になります。 設定されません。 設定されません。

要素が存在していても値が空の場合は,要素が存在しないと判断されます。
属性が存在していても値が空の場合は,属性が存在しないと判断されます。

   

●複数データを返す場合(マルチパート型)
HTTPクライアントに返すデータが,テキストデータと1ファイルのデータ,または2ファイルのデータのように複数となる場合は,応答電文(ヘッダ)およびHTTPレスポンスヘッダ定義ファイルの指定に関係なく,Content-Typeヘッダのメディアタイプにはmultipart/form-dataが設定されます。各データのContent-Typeヘッダは,マルチパート型のレスポンスボディの各パートのヘッダに指定されます。各データに指定される値は,「●テキストデータを返す場合」,および「●ファイルのデータを返す場合」の説明にそれぞれ従います。

●バイナリデータを返す場合
テキストデータを返す場合と同様にHTTPレスポンスヘッダに使用されるContent-Typeヘッダおよびcharset属性は,応答電文(ヘッダ)のcontent-type要素,http-header要素,HTTPレスポンスヘッダ定義ファイルなどで設定できます。
Content-Typeヘッダおよびcharset属性を複数指定した場合も,テキストデータを返すときと同様に,応答電文フォーマット(ヘッダ変数用)の指定が優先されます。そのため,複数指定した場合に有効となるContent-Typeヘッダおよびcharset属性は,「表2-31」,または「表2-32」を参照してください。
ただし,次の場合はContent-Typeヘッダに「application/octet-stream」が設定されます。
  • 応答電文にcontent-type要素およびcharset属性が存在しない
  • HTTPレスポンスヘッダ定義ファイルにcontent-typeキーが存在しない
  • HTTPレスポンスヘッダ定義ファイルが存在しない
(b) Content-Disposition

HTTPレスポンスのContent-Dispositionヘッダは,HTTPレスポンスのパート区分およびデータ数に応じて次の値が設定されます。ファイルをダウンロードしない場合,HTTPレスポンスにはContent-Dispositionヘッダが設定されません。

表2-34 HTTP受付が設定するContent-Dispositionヘッダの値

パート区分 データ数 設定個所 Content-Dispositionヘッダの値 name属性 filename属性
単一パート型 1ファイル HTTPレスポンスヘッダ attachment 設定されません。 応答電文(ヘッダ)のfilename
要素の値
マルチパート型 1ファイル+テキストデータ HTTPレスポンスの各パートのヘッダ form-data 応答電文(ヘッダ)のpartID要素の値
複数ファイル

注※
HTTP受付定義ファイルのhttprecp.response.download.disposition-typeプロパティで変更できます。

応答電文(ヘッダ)のhttp-header要素内にcontent-disposition要素が含まれていた場合,その値は無視されます。なお,HTTPレスポンスヘッダ定義ファイルでContent-Dispositionヘッダが指定されている場合はその値が有効になります。

(c) Content-Length

テキストデータだけをHTTPレスポンスで返す場合,コンテンツ長を表すContent-LengthヘッダをHTTP受付で生成するかどうかは,HTTP受付定義ファイルのhttprecp.response.generate.content-lengthプロパティで指定できます。また,コンテンツ長を計算するときに使用する文字コードは,HTTP受付定義ファイルのhttprecp.http.charsetプロパティで指定できます。

HTTP受付定義ファイルの詳細は,マニュアル「サービスプラットフォーム リファレンス」の「HTTP受付定義ファイル」を参照してください。

HTTP受付定義ファイルの指定がある場合とない場合の,HTTPクライアントに渡されるContent-Lengthヘッダの値を次の表に示します。

表2-35 HTTPクライアントに渡されるContent-Lengthヘッダ

httprecp.response.generate.content-lengthプロパティの値 HTTPレスポンスヘッダ定義ファイルのcontent-lengthキーまたは応答電文(ヘッダ)のhttp-header要素のcontent-length要素の指定有無 HTTPクライアントに渡されるContent-Lengthヘッダの値
true HTTPレスポンス定義ファイルまたは応答電文(ヘッダ)で指定した値は,HTTP受付が計算したデータ長に上書きされます。
×
false HTTPレスポンスヘッダ定義ファイルまたは応答電文(ヘッダ)に指定したデータ長をContent-Lengthヘッダに設定します。
× HTTPクライアントにContent-Lengthヘッダを渡しません。

(凡例)
○:指定している場合です。
×:指定していない場合です。

注※
HTTP受付定義ファイルのhttprecp.response.generate.content-lengthプロパティが「false」で,応答電文(ヘッダ)のhttp-header要素で複数のcontent-length要素が指定された場合,またはHTTPレスポンスヘッダ定義ファイルで複数のcontent-lengthキーと値のペアが指定された場合,指定のうちどれか1つの値が設定されます。ただし,どの値が設定されるかは保証されません。

なお,ファイルを1つ以上ダウンロードする場合は,Content-Lengthヘッダをクライアントに送信する設定にしていた場合でも無効になります。また,ファイルをダウンロードしない場合でも,応答電文(ヘッダ)のignore-bodymsg要素またはHTTP受付定義ファイルのhttprecp.response.ignore-bodymsgプロパティで応答電文(ボディ)を無視する設定にしているときは,Content-Lengthヘッダが設定されません。

(3) HTTPレスポンスボディの処理

HTTPクライアントに送信するデータ形式ごとに,HTTPレスポンスボディの処理について説明します。

(a) テキストデータだけの場合

ビジネスプロセスの処理が完了したあと,HTTP受付には応答電文(ボディ)変数がXML型の文字列として返り,HTTPレスポンスボディにテキストデータとして設定されます。設定する際,指定された文字コードによってエンコードされます。

システム例外が発生した場合は,エラーメッセージIDとメッセージの内容が応答電文(ボディ)の要素に設定されます。

テキストデータで返せるデータは応答アクティビティで指定した応答電文(ボディ)の部分だけです。このため,マルチパート型のレスポンスを返す場合,テキストデータが存在するパートは1つだけとなります。

XML要素に設定するテキストデータは,HTTP受付定義ファイルで指定した文字コードごとにエンコードする必要があります。

なお,ビジネスプロセスから受信した応答電文(ボディ)をHTTP受付が無視する(HTTPレスポンスに設定しない)かどうかを,応答電文(ヘッダ)のignore-bodymsg要素またはHTTP受付定義ファイルのhttprecp.response.ignore-bodymsgプロパティで設定できます。応答電文(ヘッダ)とHTTP受付定義ファイルの両方で指定した場合,応答電文(ヘッダ)の指定が優先されます。この要素(またはプロパティ)を指定し,かつダウンロードするファイルのデータが1つもない場合は,空のHTTPレスポンスボディをHTTPクライアントに返します。

(b) ファイルのデータの場合

ファイルのデータをダウンロードする場合,応答電文(ヘッダ)のfile要素内でダウンロード対象のファイル名などを指定します。応答電文(ヘッダ)で指定する要素と対応するHTTPレスポンスヘッダを次に示します。

表2-36 応答電文(ヘッダ)で指定する要素

応答電文(ヘッダ)で指定する要素名 説明 対応するHTTPレスポンスヘッダ
(マルチパート型の場合は各パートに対応するヘッダ)
省略した場合の値
partID マルチパート型の各パートを表すパート識別名です。 Content-Dispositionヘッダのname属性 local-file-name要素で指定した中間ファイル名が設定されます。マルチパート型にならない場合は指定しても無視され,name属性は付与されません。
file-name HTTPクライアントにダウンロードする際のダウンロードファイル名です。 Content-Dispositionヘッダのfilename属性 なし(filename属性が設定されません)。
local-file-name 作業フォルダ内のダウンロード対象の中間ファイル名です。指定した名称のファイルが存在しない場合はエラーになります。 なし 省略できません。
content-type ダウンロードファイルのメディアタイプを指定します。 Content-Typeヘッダ なし(Content-Typeヘッダが設定されません)。
charset ダウンロードファイルの文字コードを指定します。 charset属性 なし。

注※
content-type要素の指定を省略した場合,ダウンロードするファイルのContent-TypeヘッダはHTTP受付で設定しません。なお,ダウンロードするファイルが複数ある場合,またはファイルとテキストデータのマルチパート型となる場合,HTTPレスポンスヘッダのContent-Typeヘッダはmultipart/form-dataとなり,各ファイルのデータのContent-Typeヘッダはパートごとのヘッダに指定されます。

参考
HTTPレスポンス時にテキストデータを返さないでファイルを1つだけダウンロードしたい場合などのために,応答電文(ボディ)で指定されたテキストデータをHTTP受付が無視するかどうかを設定できます。この設定は,応答電文(ヘッダ)のignore-bodymsg要素,またはHTTP受付定義ファイルのhttprecp.response.ignore-bodymsgプロパティで変更できます。HTTPレスポンスごとに設定を動的に変更したい場合は応答電文(ヘッダ)で設定します。
応答電文(ヘッダ)とHTTP受付定義ファイルの両方で指定した場合,応答電文(ヘッダ)の指定が優先されます。
ただし,応答電文(ボディ)を無視する設定の場合でも,ビジネスプロセスの応答アクティビティのボディ割当変数には,任意の変数を設定しておく必要があります。このため,サービスプラットフォームが提供している応答電文フォーマット(ボディ変数用)のダミーフォーマット(urecp_http_dummy_body_response.xsd)をボディ変数用のダミーとして使用することを推奨します。
(c) バイナリデータの場合

HTTP受付の応答電文の電文フォーマットにバイナリ形式または任意形式(any形式)を指定することで,HTTPレスポンスボディにバイナリデータを設定してクライアントに応答を返すことができます。

HTTPレスポンスボディにバイナリデータが設定されるのは,次の条件をすべて満たす場合だけです。

 

注意
  • ビジネスプロセスの応答電文(ボディ)を無視する設定(HTTP受付定義ファイルにhttprecp.response.ignore-bodymsg=trueを指定している)の場合,HTTPレスポンスボディにはバイナリデータが設定されません。
  • HTTP受付の応答電文の電文フォーマットにXML形式(拡張子:xsd)を指定している場合はテキストデータとして処理されます。
  • 応答電文(ヘッダ)にfile要素が存在する場合,バイナリデータをHTTPレスポンスボディへ設定することはできません。
  • HTTPレスポンスボディに設定するバイナリデータは文字エンコーディングが行われません。

(4) ステータスコード

HTTPリクエストおよびHTTPレスポンスのステータスコードについて説明します。

(a) 応答時のステータスコード

応答時のステータスコードは,応答のタイミングおよび種類によって設定される値が異なります。ステータスコードの設定値と応答のタイミングを次の表に示します。

表2-37 設定されるステータスコード

タイミング 応答の種類 応答電文(ヘッダ)でのstatus-code要素の指定
あり なし
ビジネスプロセスを呼び出す前 HTTP受付の検証でエラーが発生した場合 エラーの状況に応じてHTTP受付がステータスコードを設定します。
ビジネスプロセスを呼び出したあと 正常終了の場合 応答電文(ヘッダ)のstatus-code要素で設定したステータスコードが使用されます。※1 200※2
フォルトの場合 応答電文(ヘッダ)のstatus-code要素で設定したステータスコードが使用されます。※1 200※3
システム例外の場合 HTTP受付定義ファイルのhttprecp.system-exception.status-codeプロパティの値が有効になります。※4

(凡例)
−:該当しません。

注※1
ステータスコードが正常終了の場合やエラーの場合であるかどうかは検証されません。このため,応答電文(ヘッダ)にエラーの範囲(例:400〜599)のステータスコードを設定した場合,HTTPクライアントにはステータスコードがそのまま返されます。

注※2
ステータスコードを設定していない場合のデフォルト値です。

注※3
フォルトの場合でステータスコードを設定していないときは,正常終了の場合とみなされて,デフォルト値が設定されます。

注※4
HTTP受付定義ファイルの指定がない場合は,デフォルト値の500が設定されます。

(b) エラー発生時のステータスコード

HTTPリクエストおよびHTTPレスポンスの処理でエラーが発生した場合の,メッセージIDとステータスコードの対応を次の表に示します。

表2-38 リクエスト処理でエラーが発生した場合のステータスコード一覧

メッセージID エラー発生時の状況 ステータスコード
KDEC80424 内部エラーが発生した場合(HTTPヘッダまたはHTTPボディのXML形式の変換時にエラーが発生した) 500
KDEC80438 HTTPメソッドがGETまたはPOST以外の場合 405
KDEC80439 URLで指定されたオペレーション名が,HTTP受付で指定されたオペレーション名と一致しない場合 404
KDEC80440 クエリ文字列,HTTPボディ,またはHTTPヘッダで無効な文字が指定された場合 400
KDEC80441 パススルーモードの場合に,リクエストパラメタでmsgキーが指定されていない,または大文字で指定された場合 400
KDEC80442 HTTPリクエストヘッダまたはHTTP受付定義ファイルで指定したエンコードに従ったURLのデコーディング中にエラーが発生した場合 500
KDEC80451 次のどちらかの原因で一意となるリクエストIDを生成できなかった場合
  • リクエストIDを生成するための時刻,日付,HTTPクライアントのIPアドレスなどのパラメタの取得に失敗した
  • 同一時刻に同一のIPアドレスから大量のリクエストを受信して使用できるIDがなくなった
500
KDEC80452 HCSCサーバランタイム定義ファイルで指定された作業フォルダルートのディレクトリが存在しない場合 500
KDEC80453 作業フォルダの作成に失敗した場合 500
KDEC80454 マルチパート型HTTPリクエストのデータの受信・解析に失敗した場合 400
KDEC80457 中間ファイルの出力中にエラーが発生した場合 500

表2-39 レスポンス処理でエラーが発生した場合のステータスコード一覧

メッセージID エラー発生時の状況 ステータスコード
KDEC80424 内部エラーが発生した場合(HTTPレスポンスボディのストリーム取得に失敗した,またはHTTPレスポンスボディへの値の書き込み中に例外が発生した) 500
KDEC80443 受付時に,HTTPヘッダまたはHTTPボディの解析でエラーが発生した場合 500
KDEC80444 応答電文のエンコーディング時にエラーが発生した場合 500
KDEC80445 ビジネスプロセスから返されたステータスコードが,3桁より大きいか,または小さい桁数だった場合 500
KDEC80458 中間ファイルの読み込みに失敗した場合 500
KDEC80459 作業フォルダの削除に失敗した場合 200