Hitachi

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


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

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

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

ステータスライン

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

HTTPレスポンスヘッダ

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

HTTPレスポンスボディ

HTTPクライアントに応答を返すテキストデータまたはバイナリデータが格納されます。

〈この項の構成〉

(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‒48 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‒49 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レスポンスヘッダ定義ファイルの詳細は,マニュアル「サービスプラットフォーム リファレンス」の「3.11.1 HTTPレスポンスヘッダ定義ファイル」を参照してください。

●ファイルのデータを返す場合

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

表2‒50 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-48」,または「表2-49」を参照してください。

ただし,次の場合はContent-Typeヘッダに「application/octet-stream」が設定されます。

  • 応答電文にcontent-type要素およびcharset属性が存在しない

  • HTTPレスポンスヘッダ定義ファイルにcontent-typeキーが存在しない

  • HTTPレスポンスヘッダ定義ファイルが存在しない

(b) Content-Disposition

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

表2‒51 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受付定義ファイルの詳細は,マニュアル「サービスプラットフォーム リファレンス」の「3.11.3 HTTP受付定義ファイル」を参照してください。

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

表2‒52 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レスポンスボディの処理について説明します。

また,レスポンスボディをgzip形式で圧縮する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‒53 応答電文(ヘッダ)で指定する要素

応答電文(ヘッダ)で指定する要素名

説明

対応する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レスポンスボディに利用する設定であること(HTTP受付定義ファイルにhttprecp.response.ignore-bodymsg=falseを指定していること)

  • HTTP受付の応答電文の電文フォーマットにバイナリ形式(拡張子:fdx)または任意形式(any形式)を指定していること

  • 応答電文(ヘッダ)にfile要素が存在しないこと

注意事項
  • ビジネスプロセスの応答電文(ボディ)を無視する設定(HTTP受付定義ファイルにhttprecp.response.ignore-bodymsg=trueを指定している)の場合,HTTPレスポンスボディにはバイナリデータが設定されません。

  • HTTP受付の応答電文の電文フォーマットにXML形式(拡張子:xsd)を指定している場合はテキストデータとして処理されます。

  • 応答電文(ヘッダ)にfile要素が存在する場合,バイナリデータをHTTPレスポンスボディへ設定することはできません。

  • HTTPレスポンスボディに設定するバイナリデータは文字エンコーディングが行われません。

(d) HTTPレスポンス圧縮機能

HTTP受付のレスポンス処理では,アプリケーションサーバのHTTPレスポンス圧縮機能を使用して,レスポンスボディをgzip形式で圧縮できます。

HTTPレスポンス圧縮機能については,マニュアル「アプリケーションサーバ 機能解説 互換編」の「9.2 HTTPレスポンス圧縮機能」を参照してください。

HTTPレスポンス圧縮機能を使用するには,HTTP受付定義ファイルにHTTPレスポンス圧縮規則を指定する必要があります。HTTP受付定義ファイルで次のプロパティを設定してください。

  • httprecp.response.compression.url-pattern<URLパターン識別番号>

  • httprecp.response.compression.rule<圧縮規則識別番号>.url-mapping<URLマッピング識別番号>

  • httprecp.response.compression.rule<圧縮規則識別番号>.condition<圧縮条件識別番号>

HTTPクライアントからHTTPリクエストを送信する場合は,gzip形式で圧縮されたHTTPレスポンスを受信できることを示すHTTPヘッダを付けてください。

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

(4) ステータスコード

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

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

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

表2‒54 設定されるステータスコード

タイミング

応答の種類

応答電文(ヘッダ)での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‒55 リクエスト処理でエラーが発生した場合のステータスコード一覧

メッセージ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

KDEC80456

HTTPメソッドが,ユーザ定義受付(呼出先選択)として定義したHTTP受付のオペレーション名と一致しない場合

404

KDEC80457

中間ファイルの出力中にエラーが発生した場合

500

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

メッセージID

エラー発生時の状況

ステータスコード

KDEC80424

内部エラーが発生した場合(HTTPレスポンスボディのストリーム取得に失敗した,またはHTTPレスポンスボディへの値の書き込み中に例外が発生した)

500

KDEC80443

受付時に,HTTPヘッダまたはHTTPボディの解析でエラーが発生した場合

500

KDEC80444

応答電文のエンコーディング時にエラーが発生した場合

500

KDEC80445

ビジネスプロセスから返されたステータスコードが,3桁より大きいか,または小さい桁数だった場合

500

KDEC80458

中間ファイルの読み込みに失敗した場合

500

KDEC80459

作業フォルダの削除に失敗した場合

200