HTTP 送信アダプタの使用法
ここでは、HTTP 送信アダプタ (EnsLib.HTTP.OutboundAdapterOpens in a new tab) の全般的な動作、およびプロダクションでのこのアダプタの使用法について説明します。
InterSystems IRIS® データ・プラットフォームでは、このアダプタを使用する特殊なビジネス・サービス・クラスとユーザのニーズに適したビジネス・サービス・クラスの 1 つも提供されます。そのため、プログラミングの必要がありません。"HTTP および SOAP アダプタを使用するビジネス・ホスト・クラス" を参照してください。
全般的な動作
プロダクション内で、送信アダプタは、ユーザが作成および構成するビジネス・オペレーションに関連付けられます。このビジネス・オペレーションはプロダクション内からメッセージを受信し、メッセージ・タイプを調べ、適切なメソッドを実行します。このメソッドは、通常、関連するアダプタのメソッドを実行します。
EnsLib.HTTP.OutboundAdapterOpens in a new tab は、HTTP 要求をプロダクションの外部に送信し HTTP 応答を受信するアダプタです。このアダプタは、以下のような項目を制御する設定を提供します。
-
アダプタが HTTP 要求を送信するサーバおよびポート
-
指定されたサーバおよびポートで、要求するリソースの URL パス
-
サーバへの接続に使用するオプションの TLS 構成
-
アダプタが要求をルーティングするプロキシ・サーバを指定するためのオプション情報
HTTP 要求には、ローカル InterSystems IRIS サーバのデフォルトの文字エンコードが使用されます。異なる文字エンコードを指定するには、カスタム HTTP 要求を作成して送信します。これについては、"カスタム HTTP 要求の作成" を参照してください。
アダプタを使用するビジネス・オペレーションの作成
EnsLib.HTTP.OutboundAdapterOpens in a new tab を使用するビジネス・オペレーションを作成するために、新しいビジネス・オペレーション・クラスを作成します。後で、それをプロダクションに追加して、構成します。
存在しなければ、適切なメッセージ・クラスを作成する必要もあります。
ビジネス・オペレーション・クラスの基本要件を以下に列挙します。
-
ビジネス・オペレーション・クラスは、Ens.BusinessOperationOpens in a new tab を拡張するものでなければなりません。
-
クラスの ADAPTER パラメータは EnsLib.HTTP.OutboundAdapterOpens in a new tab である必要があります。
-
クラスの INVOCATION パラメータは、使用する呼び出しスタイルを指定する必要があります。以下のいずれかを使用します。
-
Queue は、メッセージが 1 つのバックグラウンド・ジョブ内で作成され、元のジョブが解放された段階でキューに配置されることを意味します。その後、このメッセージが処理されると、別のバックグラウンド・ジョブがこのタスクに割り当てられます。これは最も一般的な設定です。
-
InProc は、メッセージが、作成されたジョブと同じジョブで生成、送信、および配信されることを意味します。このジョブは、メッセージが対象に配信されるまで送信者のプールに解放されません。これは特殊なケースのみに該当します。
-
-
クラスでは、少なくとも 1 つのエントリを含むメッセージ・マップを定義します。メッセージ・マップは、以下の構造を持つ XData ブロック・エントリです。
XData MessageMap { <MapItems> <MapItem MessageType="messageclass"> <Method>methodname</Method> </MapItem> ... </MapItems> }
-
クラスでは、メッセージ・マップ内で名前が付けられたすべてのメソッドを定義します。これらのメソッドは、メッセージ・ハンドラと呼ばれます。各メッセージ・ハンドラは、以下のシグニチャを持っている必要があります。
Method Sample(pReq As RequestClass, Output pResp As ResponseClass) As %Status
ここで、Sample はメソッド名、RequestClass は要求メッセージ・クラスの名前、ResponseClass は応答メッセージ・クラスの名前です。通常、メソッド・コードは、ビジネス・オペレーションのプロパティおよび Adapter プロパティのメソッドを参照します。
メッセージ・クラスの定義方法は、"メッセージの定義" を参照してください。
メッセージ・ハンドラ・メソッドの定義方法は、"メッセージ・ハンドラ・メソッドの作成" を参照してください。
-
その他のオプションと一般情報は、"ビジネス・オペレーション・クラスの定義" を参照してください。
以下の例は、必要となる一般的な構造を示しています。
Class EHTTP.NewOperation1 Extends Ens.BusinessOperation
{
Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter";
Parameter INVOCATION = "Queue";
Method Sample(pReq As RequestClass, Output pResp As ResponseClass) As %Status
{
Quit $$$ERROR($$$NotImplemented)
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="RequestClass">
<Method>Sample</Method>
</MapItem>
</MapItems>
}
}
メッセージ・ハンドラの作成
EnsLib.HTTP.OutboundAdapterOpens in a new tab で使用するビジネス・オペレーション・クラスを作成する場合の最大のタスクは、通常、このアダプタで使用するメッセージ・ハンドラ、つまり、プロダクション・メッセージを受信してさまざまな HTTP 操作を実行するメソッドの記述です。
各メッセージ・ハンドラ・メソッドは、以下のシグニチャを持っている必要があります。
Method Sample(pReq As RequestClass, Output pResp As ResponseClass) As %Status
ここで、Sample はメソッド名、RequestClass は要求メッセージ・クラスの名前、ResponseClass は応答メッセージ・クラスの名前です。
通常、このメソッドは以下の操作を実行します。
-
受信要求メッセージを調べます。
-
受信要求の情報を使用して、ビジネス・オペレーションの Adapter プロパティのメソッドを呼び出します。例えば、HTTP GET コマンドを送信する Get メソッドを呼び出します。
set status=..Adapter.Get(.pHttpResponse,"Name",pRequest.Name)
この例は GET 要求を送信し、pRequest.Name という値を持つ Name と呼ばれるパラメータで渡します。
使用可能なメソッドについては、次の節で説明します。各メソッドは、ステータス (具体的には、%StatusOpens in a new tab のインスタンス) を返します。
これらのメソッドは、出力として HTTP 応答も返します。上記の例では、応答は pHTTPResponse に配置されています。応答は %Net.HttpResponseOpens in a new tab のインスタンスです。このオブジェクトの使用法は、"HTTP 応答の使用法" を参照してください。
-
HTTP 応答を調べます。
-
HTTP 応答内の情報を使用して、応答メッセージ (Ens.ResponseOpens in a new tab またはサブクラスのインスタンス) を作成します。メソッドは出力としてこのメッセージを返します。
メッセージ・クラスの定義方法に関する基本情報は、"メッセージの定義" を参照してください。
-
必ず出力引数 (pOutput) を設定します。通常、応答メッセージと同じように設定します。この手順は必須です。
-
適切なステータスを返します。この手順は必須です。
以下に例を示します。
Method PostMessage(pRequest As EHTTP.Request.OutboundPost,
Output pResponse As EHTTP.Response.OutboundPost) As %Status
{
Set tSC=$$$OK
Set input=pRequest.MessageStream
Set tResponse = ##class(%Net.HttpResponse).%New()
Set tSC = ..Adapter.Post(.tResponse,,input)
If $$$ISOK(tSC){
Set pResponse = ##class(EHTTP.Response.OutboundPost).%New()
Set len = tResponse.Data.SizeGet()
While (tResponse.Data.AtEnd = 0) {
Do pResponse.MessageStream.Write(tResponse.Data.Read())
}
}
Return tSC
}
HTTP コマンドの呼び出し
このアダプタは、HTTP、POST、GET、PATCH、PUT、DELETE の各要求を送信するメソッドを提供します。
-
メイン・メソッドは HTTP アクションの後で指定されます。例えば、Post() メソッドは POST 要求を扱います。これらのメイン・メソッドのそれぞれで、応答オブジェクトの出力引数、フォーム変数名のカンマ区切りリスト、およびフォーム変数引数の変数数値 (1 つの変数数値がカンマ区切りリスト内の各名前に対応) を使用できます。1 つのフォーム変数に複数の値を設定する場合は、リスト内で同じ名前を複数回使用できます。もちろん、フラットなスカラ・コンテンツ (通常の Web ページなど) を要求するために、フォーム変数なしでこれらのメソッドを使用することもできます。
-
フォーム変数の複雑なセットがある状況では、変数引数のリストの代わりに多次元配列を受け入れる代替メソッドを使用できます。HTTP アクションごとに、これらの代替メソッドのいずれかを指定します。例えば、Post() メソッドの代わりに PostFormDataArray() メソッドを使用できます。多次元配列は、名前リスト内で複数のエントリを使用することなく、所定のフォーム変数の複数の値を配列のサブノードとして提供できるため、情報の組織化に役立ちます。また、位置ではなくフォーム変数名によって配列にインデックスを割り当てることができます。
-
その他の特別な HTTP 要求を使用する必要がある場合や、フォーム変数や Cookie 以外の HTTP 要求の面でカスタマイズをする必要がある場合には、低レベルのワーカ・メソッドである SendFormDataArray() を使用できます。
EnsLib.HTTP.OutboundAdapterOpens in a new tab のメソッドを使用して HTTP コマンドを送信する方法の詳細は、以下の各トピックを参照してください。
フォーム・データの送信
アダプタのどのメソッドを使用しても HTTP フォーム・データを送信できます。各メソッドは (出力として) HTTP 応答 (%Net.HttpResponse のインスタンス) を返します。このオブジェクトの使用法の詳細は、"HTTP 応答の使用法" を参照してください。
詳細はメソッドによって異なりますが、一部を例に示します。
set tFormVar="USER,ROLE,PERIOD"
set tUserID=pRequest.UserID
set tRole=pRequest.UserRole
set tED=pRequest.EffectiveDate
set tSC=..Adapter.Get(.tResponse,tFormVar,tUserID,tRole,tED)
この例では、要求メッセージに UserID、UserRole、および EffectiveDate のプロパティがあると仮定します。
要求本文の送信
アダプタのどのメソッドを使用しても要求の本文を送信できます。この場合、要求本文を引数として渡すので、フォーム・データ引数は空のままにしておきます。要求本文は、必要に応じて、ストリームまたは文字列のいずれかになります。ストリームとしての作成とそのストリームへの書き込みについては、"ストリームを使用した作業" を参照してください。
これらの各メソッドは (出力として) HTTP 応答 (%Net.HttpResponseOpens in a new tab のインスタンス) を返します。このオブジェクトの使用法の詳細は、"HTTP 応答の使用法" を参照してください。
詳細はメソッドによって異なりますが、一部を例に示します。
set tsc = ..Adapter.Post(.tResponse,,pRequest.MessageStream)
この例では、要求メッセージに MessageStream プロパティがあると仮定します。
また、EnsLib.HTTP.OutboundAdapterOpens in a new tab を使用して、形式を text/xml としたデータを POST 送信するには、HTTPRequest オブジェクト (データの POST 送信に使用するクラス・メソッドへの入力とするオブジェクト) の EntityBody プロパティに、目的のデータを置く必要があります。
HTTP ヘッダとしてのストリーム属性
ストリームを作成して要求本文として送信する場合、HTTP 送信アダプタが、HTTP ヘッダとして一部またはすべてのストリーム属性を含むようにすることができます。そのためには、SkipBodyAttrs プロパティを、HTTP ヘッダとして使用されない属性のリストと同じに設定する必要があります。デフォルト値は "*" です。これは、ストリーム属性はデフォルトでは無視される (そしてヘッダとして使用されない) ことを意味します。このプロパティは、実行時設定として使用できません。
ストリーム属性の詳細は、%Library.AbstractStreamOpens in a new tab のクラス参照を参照してください。
HTTP メソッドについての参照情報
この節では、HTTP コマンドの呼び出しに使用できるメソッドについての参照情報を提供します。
Method Post(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) As %Status
構成された宛先に HTTP POST コマンドを送信します ("宛先の指定" を参照)。フォーム・データまたは要求本文を送信します。
HTTP 応答は、最初の引数で出力として返されます。これは %Net.HttpResponseOpens in a new tab のインスタンスです。このオブジェクトの使用法は、"HTTP 応答の使用法" を参照してください。
このメソッドを使用して、以下のいずれかを行います。
-
指定されたフォーム変数にフォーム・データを送信するには、pFormVarNames 引数および pData 引数を必要に応じて指定します。pFormVarNames は、使用するフォーム変数名のカンマ区切りリストです。リスト内の各名前に対して、pData 引数を提供します。
指定されたフォーム変数に複数の値を渡すには、pFormVarNames リストにその変数名を複数回含めます。
追加の pData 引数を提供すると、リストの最後のフォーム変数に割り当てられます。
-
フォーム変数ではなく要求本文を送信するには、pFormVarNames を空のままにしておき、pData 引数として要求本文を渡します。
本文テキストとして渡されるデータ値は、文字列またはストリームです。フォーム変数として渡されるデータ値は、文字列である必要があります。
Method PostFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
ByRef pData) As %Status
構成された宛先に HTTP POST コマンドを送信します ("宛先の指定" を参照)。指定されたフォーム変数にフォーム・データを送信します。
pFormVarNames は、使用するフォーム変数名のカンマ区切りのリストです。リスト内の各名前に対して、pData 引数を提供します。
pData 引数は配列です。配列の最上位ノードは使用されません。各サブノードは、pFormVarNames リストにある対応するフォーム変数のインデックスによって、添え字が付けられます。指定された添え字の値は、次のように指定します。
-
単一の値を持つフォーム変数 (varname) の場合、pData(“varname”) の値には、送信するフォーム・データ値を指定します。サブノードはありません。
-
複数の値を持つフォーム変数 (varname) の場合、pData(“varname”) の値には、値の数を指定します。このフォーム変数の各値はサブノードで使用され、ノード内での位置によって添え字が付けられます。
method PostURL(pURL As %String,
Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
指定された URL (pURL) に HTTP POST コマンドを送信します。指定されたフォーム変数にフォーム・データを送信します。これにより、アダプタの URL プロパティをオーバーライドできます。Post() も参照してください。
Method Get(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) As %Status
構成された宛先に HTTP GET コマンドを送信します ("宛先の指定" を参照)。フォーム・データまたは要求本文を送信します。"Post()" も参照してください。
Method GetFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
ByRef pData) As %Status
構成された宛先に HTTP GET コマンドを送信します ("宛先の指定" を参照)。指定されたフォーム変数にフォーム・データを送信します。PostFormDataArray() も参照してください。
method GetURL(pURL As %String,
Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
指定された URL (pURL) に HTTP GET コマンドを送信します。指定されたフォーム変数にフォーム・データを送信します。これにより、アダプタの URL プロパティをオーバーライドできます。Post() も参照してください。
Method Put(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) As %Status
構成された宛先に HTTP PUT コマンドを送信します ("宛先の指定" を参照)。フォーム・データまたは要求本文を送信します。"Post()" も参照してください。
Method PutFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
ByRef pData) As %Status
構成された宛先に HTTP PUT コマンドを送信します ("宛先の指定" を参照)。指定されたフォーム変数にフォーム・データを送信します。PostFormDataArray() も参照してください。
method PutURL(pURL As %String,
Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
指定された URL (pURL) に HTTP PUT コマンドを送信します。指定されたフォーム変数にフォーム・データを送信します。これにより、アダプタの URL プロパティをオーバーライドできます。Post() も参照してください。
Method Patch(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) As %Status
構成された宛先に HTTP PATCH コマンドを送信します (“宛先の指定” を参照)。フォーム・データまたは要求本文を送信します。Post() も参照してください。
Method PatchFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
ByRef pData) As %Status
構成された宛先に HTTP PATCH コマンドを送信します (“宛先の指定” を参照)。指定されたフォーム変数にフォーム・データを送信します。PostFormDataArray() も参照してください。
method PatchURL(pURL As %String,
Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
指定された URL (pURL) に HTTP PATCH コマンドを送信します。指定されたフォーム変数がフォーム・データに送信されます。これにより、アダプタの URL プロパティをオーバーライドできます。Post() も参照してください。
method Delete(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
構成された宛先に HTTP DELETE コマンドを送信します ("宛先の指定" を参照)。フォーム・データまたは要求本文を送信します。"Post()" も参照してください。
method DeleteFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
ByRef pData) as %Status
構成された宛先に HTTP DELETE コマンドを送信します ("宛先の指定" を参照)。指定されたフォーム変数にフォーム・データを送信します。PostFormDataArray() も参照してください。
method DeleteURL(pURL As %String,
Output pHttpResponse As %Net.HttpResponse,
pFormVarNames As %String = "",
pData...) as %Status
指定された URL (pURL) に HTTP DELETE コマンドを送信します。指定されたフォーム変数にフォーム・データを送信します。これにより、アダプタの URL プロパティをオーバーライドできます。Post() も参照してください。
Method SendFormDataArray(Output pHttpResponse As %Net.HttpResponse,
pOp As %String,
pHttpRequestIn As %Net.HttpRequest,
pFormVarNames As %String = "",
ByRef pData) As %Status
構成された宛先に HTTP 要求を送信します ("宛先の指定" を参照)。指定されたフォーム変数にフォーム・データを送信します。
pOp 引数は、実行する HTTP アクションを指定します。これは、"POST"、"GET"、"PUT" のいずれかです。
pFormVarNames は、使用するフォーム変数名のカンマ区切りのリストです。リスト内の各名前に対して、pData 引数を提供します。
pData 引数は配列です。GetFormDataArray() メソッドも参照してください。
特別なニーズに対しては、%Net.HTTPRequest またはサブクラスのインスタンスを作成し、そのプロパティを指定して、これを pHttpRequestIn 引数として使用します。これを行う場合、HTTP 要求はインスタンスのプロパティを使用して初期化されます。このメソッドを使用すると、送信アダプタの他のメソッドよりも詳細な制御が可能になります。例えば、このメソッドを使用すると、独自の HTTP ヘッダを要求に追加できます。
HTTP 応答の処理
これまでに説明したメソッドを使用する場合、出力として、HTTP 応答を受信します。このオブジェクトは %Net.HttpResponseOpens in a new tab のインスタンスです。詳細は、"HTTP 応答の使用法" を参照してください。
カスタム HTTP 要求の作成
HTTP 送信アダプタの一般的なメソッド (Get など) を使用すると、アダプタは自動的に HTTP 要求を作成および送信します。この HTTP 要求にはフォーム・データまたは要求本文を含めることができます。特別な場合には、カスタム HTTP 要求を作成して、プロキシ認証や異なる文字エンコードなどの詳細を指定することもできます。
カスタム要求を送信するには、HTTP 送信アダプタの SendFormDataArray() メソッドを使用します。その方法については、"HTTP コマンドの呼び出し" を参照してください。"HTTP 要求の送信と HTTP 応答の読み取り" を参照してください。
HTTP 応答の使用法
送信アダプタを使用して HTTP 要求を送信した後、応答オブジェクト (%Net.HttpResponseOpens in a new tab) を受信します。具体的には、HTTP.OutboundAdapter の主要メソッドによって HTTP 要求を送信できます。これらのすべてのメソッドで、返信として送信される HTTP 応答にアクセスできます。
-
PostFormData()、PostFormDataArray()、GetFormData()、または GetFormDataArray メソッドを使用した場合は、メソッド呼び出しの最初の引数の出力として HTTP 応答が返されます。この引数は %Net.HttpResponseOpens in a new tab のインスタンスです。
-
SendFormDataArray() メソッドを使用した場合は、要求の HttpResponse プロパティが更新されます。このプロパティは %Net.HttpResponseOpens in a new tab のインスタンスです。
これらのメソッドの詳細は、"HTTP コマンドの呼び出し" を参照してください。
HTTP 応答の使用法の詳細は、"HTTP 要求の送信と HTTP 応答の読み取り" を参照してください。
例
この節では、2 つの例を示します。
Post の使用例
以下の例は、HTTP 送信アダプタを使用して、構成された宛先に XML メッセージを送信します。まず、ビジネス・オペレーション・クラスは以下のとおりです。
Class EHTTP.PostOperation Extends Ens.BusinessOperation
{
Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter";
Parameter INVOCATION = "Queue";
Method PostMessage(pRequest As EHTTP.Request.OutboundPost,
Output pResponse As EHTTP.Response.OutboundPost) As %Status
{
Set tSC=$$$OK
Set tResponse = ##class(%Net.HttpResponse).%New()
Set tSC = ..Adapter.Post(.tResponse,,pRequest.MessageStream)
Set stream = ""
If $$$ISOK(tSC){
Set pResponse = ##class(EHTTP.Response.OutboundPost).%New()
Set len = tResponse.Data.SizeGet()
While (tResponse.Data.AtEnd = 0) {
Do pResponse.MessageStream.Write(tResponse.Data.Read())
}
}
Return tSC
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="EHTTP.Request.OutboundPost">
<Method>PostMessage</Method>
</MapItem>
</MapItems>
}
}
要求メッセージ・クラスは以下のとおりです。
Class EHTTP.Request.OutboundPost Extends Ens.Request
{
/// MessageStream contains the complete SOAP Message to post
Property MessageStream As %GlobalCharacterStream(CONTENT = "MIXED");
}
応答メッセージ・クラスは以下のとおりです。
Class EHTTP.Response.OutboundPost Extends Ens.Response
{
/// MessageStream contains the Response to the SOAP Message post
Property MessageStream As %GlobalCharacterStream(CONTENT = "MIXED");
}
Get の使用例
以下の例では、Get() メソッドを使用しています。
Method GetEvent(pRequest As EHTTP.Request.GetEvent,
ByRef pResponse As EHTTP.Response.GetEvent) As %Status
{
Set tSC=$$$OK
Set pResponse=##class(EHTTP.Response.GetEvent).%New()
Set tFormVar="Name,Country,City"
Set tName=pRequest.EventName
Set tCountry=pRequest.EventCountry
Set tCity=pRequest.EventCity
Set tSC=..Adapter.Get(.tResponse,tFormVar,tName,tCountry,tCity)
If '$IsObject(tResponse) {Quit
}
;
;now parse the XML stream
;
Set reader=(%XML.Reader).%New()
Do tResponse.Data.Rewind()
Set tSC=reader.OpenStream(tResponse.Data)
If $$$ISERR(tSC) {
$$$LOGWARNING("Unable to open the XML Stream")
$$$TRACE("XML request probably failed")
Do tResponse.Data.Rewind()
Set traceline = tResponse.Data.Read(1000)
$$$TRACE(traceline)
Set tSC=$$$OK
Quit
}
;
;Associate a class name with the XML element Name
;
Do reader.Correlate("EventResult","EHTTP.Event.EventResult")
If reader.Next(.tResults,.tSC)
{
Set pResponse.EventValues=tResults.EventValues
}
Return tSC
}
この例は、対象のサーバから XML ファイルを取得して、そのファイルを解析し、特定のデータを取得します。
ビジネス・オペレーションの追加と構成
ビジネス・オペレーションをプロダクションに追加するには、管理ポータルを使用して以下の操作を行います。
-
カスタム・ビジネス・オペレーション・クラスのインスタンスをプロダクションに追加します。
-
特定の外部データ・ソースと通信を行うためのアダプタを構成します。具体的には、以下を行います。
-
ビジネス・オペレーションを有効化します。
-
プロダクションを実行します。