2.15.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‒60 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‒61 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‒62 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-60」,または「表2-61」を参照してください。
ただし,次の場合はContent-Typeヘッダに「application/octet-stream」が設定されます。
-
応答電文にcontent-type要素およびcharset属性が存在しない
-
HTTPレスポンスヘッダ定義ファイルにcontent-typeキーが存在しない
-
HTTPレスポンスヘッダ定義ファイルが存在しない
-
(b) Content-Disposition
HTTPレスポンスのContent-Dispositionヘッダは,HTTPレスポンスのパート区分およびデータ数に応じて次の値が設定されます。ファイルをダウンロードしない場合,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ヘッダの値を次の表に示します。
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レスポンスヘッダを次に示します。
応答電文(ヘッダ)で指定する要素名 |
説明 |
対応する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) 応答時のステータスコード
応答時のステータスコードは,応答のタイミングおよび種類によって設定される値が異なります。ステータスコードの設定値と応答のタイミングを次の表に示します。
タイミング |
応答の種類 |
応答電文(ヘッダ)での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とステータスコードの対応を次の表に示します。
メッセージ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を生成できなかった場合
|
500 |
KDEC80452 |
HCSCサーバランタイム定義ファイルで指定された作業フォルダルートのディレクトリが存在しない場合 |
500 |
KDEC80453 |
作業フォルダの作成に失敗した場合 |
500 |
KDEC80454 |
マルチパート型HTTPリクエストのデータの受信・解析に失敗した場合 |
400 |
KDEC80456 |
HTTPメソッドが,ユーザ定義受付(呼出先選択)として定義したHTTP受付のオペレーション名と一致しない場合 |
404 |
KDEC80457 |
中間ファイルの出力中にエラーが発生した場合 |
500 |
メッセージID |
エラー発生時の状況 |
ステータスコード |
---|---|---|
KDEC80424 |
内部エラーが発生した場合(HTTPレスポンスボディのストリーム取得に失敗した,またはHTTPレスポンスボディへの値の書き込み中に例外が発生した) |
500 |
KDEC80443 |
受付時に,HTTPヘッダまたはHTTPボディの解析でエラーが発生した場合 |
500 |
KDEC80444 |
応答電文のエンコーディング時にエラーが発生した場合 |
500 |
KDEC80445 |
ビジネスプロセスから返されたステータスコードが,3桁より大きいか,または小さい桁数だった場合 |
500 |
KDEC80458 |
中間ファイルの読み込みに失敗した場合 |
500 |
KDEC80459 |
作業フォルダの削除に失敗した場合 |
200 |