HTTP 要求の送信
このトピックでは、HTTP 要求 (POST や GET など) の送信方法および応答の処理方法について説明します。
HTTP 要求の概要
%Net.HttpRequestOpens in a new tab のインスタンスを作成して、さまざまな種類の HTTP 要求を送信し、応答を受信します。このオブジェクトは、Web ブラウザと同等であり、このオブジェクトを使用して、複数の要求を行うことができます。自動的に正しい Cookie が送信され、必要に応じて Referer ヘッダが設定されます。
HTTP 要求を作成するには、以下の一般的なプロセスを使用します。
-
%Net.HttpRequestOpens in a new tab のインスタンスを作成します。
-
このインスタンスのプロパティを設定し、通信する Web サーバを指定します。基本的なプロパティは以下のとおりです。
-
必要に応じて、“HTTP 要求のその他のプロパティの指定” で説明されているとおり、HTTP 要求のその他のプロパティと呼び出しメソッドを設定します。
-
その後、“HTTP 要求の送信” で説明されているとおり、%Net.HttpRequestOpens in a new tab のインスタンスの Get() メソッドまたはその他のメソッドを呼び出し、HTTP 要求を送信します。
インスタンスから複数の要求を行うことができ、それによって、Cookie および Referer ヘッダが自動的に処理されます。
-
%Net.HttpRequestOpens in a new tab の同じインスタンスを使用して、必要に応じて追加の HTTP 要求を送信します。既定により、InterSystems IRIS は TCP/IP ソケットのオープン状態を維持するので、ソケットを閉じてから再び開くことなく、再利用できます。
詳細は、“ソケット再利用の管理” を参照してください。
以下に簡単な例を示します。
set request=##class(%Net.HttpRequest).%New()
set request.Server="tools.ietf.org"
set request.Https=1
set request.SSLConfiguration="TEST"
set status=request.Get("/html/rfc7158")
Https プロパティと SSLConfiguration プロパティの詳細は、このトピックで後述する “SSL を使用した接続” を参照してください。また、この例のより完全なバージョンは、“HTTP 応答へのアクセス” を参照してください。
認証の指定
宛先サーバがログイン資格情報を必要とする場合、資格情報を提供する HTTP Authorization ヘッダを HTTP 要求に含めることができます。以降の項で詳しく説明します。
プロキシ・サーバを使用している場合、プロキシ・サーバに対してもログイン資格情報を指定できます。そのためには、ProxyAuthorization プロパティを設定します。“プロキシ・サーバの使用法” を参照してください。詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
HTTP 1.1 を使用する場合の要求の認証
HTTP 1.1 の場合に HTTP 要求を認証するには、ほとんどの場合、%Net.HttpRequestOpens in a new tab.のインスタンスの Username プロパティと Password プロパティを設定するだけです。%Net.HttpRequestOpens in a new tab のインスタンスが 401 HTTP ステータス・コードと WWW-Authenticate ヘッダを受け取ると、このインスタンスは、サポートされている認証スキームが含まれる Authorization ヘッダを使用して応答しようとします。サポートされており InterSystems IRIS 向けに構成されている最初のスキームが使用されます。既定では、以下の認証スキームがこの順序で検討されます。
-
Negotiate (RFC 4559Opens in a new tab および RFC 4178Opens in a new tab で説明されている SPNEGO および Kerberos)
-
NTLM (NT LAN Manager 認証プロトコル)
-
Basic (RFC 2617Opens in a new tab で説明されている Basic アクセス認証)
Important:
Basic 認証が使用される可能性がある場合、SSL も使用していることを確認してください ("“SSL を使用した接続” を参照)。Basic 認証では、資格情報は Base 64 のエンコード形式で送信されるため、簡単に読み取ることができます。
Windows では、Username プロパティが指定されていない場合、InterSystems IRIS は代わりに現在のログイン・コンテキストを使用できます。具体的には、SPNEGO、Kerberos、または NTLM の場合にサーバが 401 ステータス・コードと WWW-Authenticate ヘッダを使用して応答すると、InterSystems IRIS は現在のオペレーティング・システムのユーザ名とパスワードを使用して、Authorization ヘッダを作成します。
以下に示すように、HTTP 1.0 の場合とは詳細が異なります。
Negotiate と NTLM は HTTP 1.1 でのみサポートされています。これらのスキームには複数回の往復が必要ですが、HTTP 1.0 では要求と応答の各ペアの後に接続を閉じる必要があるからです。
バリエーション
サーバで許可される認証スキームがわかっている場合は、選択したスキームのサーバ用の初期トークンが含まれる Authorization ヘッダを含めることによって、サーバからの最初の往復をバイパスできます。 このためには、%Net.HttpRequestOpens in a new tab インスタンスの InitiateAuthentication プロパティを設定します。このプロパティの値として、サーバで許可されている 1 つの認証スキームの名前を指定します。以下の値のいずれかを使用します (大文字と小文字が区別されます)。
使用する認証スキームをカスタマイズする (または検討される順序を変更する) 場合は、%Net.HttpRequestOpens in a new tab インスタンスの AuthenticationSchemes を設定します。このプロパティの値として、認証スキーム名のコンマ区切りリストを指定します (前述のリストで示している正確な値を使用します)。
Authorization ヘッダを直接指定する方法
HTTP 1.0 と HTTP 1.1 (シナリオに適用できる場合) のいずれの場合でも、HTTP Authorization ヘッダを直接指定できます。具体的には、要求しているリソースのユーザ・エージェントに必要な認証情報に等しい値に Authorization プロパティを設定します。
Authorization プロパティを指定すると、Username プロパティと Password プロパティは無視されます。
HTTP 認証のログの有効化
HTTP 認証のログを有効にするには、ターミナルで以下を入力します。
set $namespace="%SYS"
kill ^ISCLOG
set ^%ISCLOG=2
set ^%ISCLOG("Category","HttpRequest")=5
ログ・エントリは、^ISCLOG グローバルに書き込まれます。ログをファイルに書き込むには (読みやすくするため)、以下を入力します (引き続き、%SYS ネームスペース内です)。
do ##class(%OAuth2.Utils).DisplayLog("filename")
filename は、作成するファイルの名前です。このディレクトリは既に存在している必要があります。ファイルが既に存在する場合は、そのファイルが上書きされます。
ログを停止するには、以下を入力します (引き続き、%SYS ネームスペース内です)。
set ^%ISCLOG=0
set ^%ISCLOG("Category","HttpRequest")=0
HTTP 要求のその他のプロパティの指定
HTTP 要求を送信する前に (“HTTP 要求の送信” を参照)、以下のセクションの説明に従って、プロパティを指定することができます。
最後にリストされているセクションで説明しているとおり、%Net.HttpRequestOpens in a new tab のすべてのプロパティの既定値を指定できます。
Location プロパティ
Location プロパティでは、Web サーバから要求するリソースを指定します。このプロパティを設定すると、Get()、Head()、Post()、または Put() の各メソッドを呼び出す際、場所の引数を省略できます。
例えば、URL http://machine_name/test/index.html に HTTP 要求を送信しているとします。
この場合、以下の値を使用します。
%Net.HttpRequest のプロパティの例
プロパティ |
値 |
Server |
machine_name |
Location |
test/index.html |
インターネット・メディア・タイプと文字エンコードの指定
以下のプロパティを使用して、インターネット・メディア・タイプOpens in a new tab (MIME タイプ とも呼ばれます)、および %Net.HttpRequestOpens in a new tab のインスタンスとそのレスポンス内の文字エンコードを指定できます。
-
ContentType では、Content-Type ヘッダを指定します。このヘッダで、要求の本文のインターネット・メディア・タイプを指定します。既定タイプは、None です。
指定可能な値は、application/json、application/pdf、application/postscript、image/jpeg、image/png、multipart/form-data、text/html、text/plain、text/xml などの他にも多数あります。詳細なリストは、http://www.iana.org/assignments/media-typesOpens in a new tab を参照してください。
-
ContentCharset プロパティは、コンテンツがテキスト・タイプ (text/html や text/xml など) の場合、要求のコンテンツのための目的の文字セットを制御します。このプロパティを指定しない場合、InterSystems IRIS では、InterSystems IRIS サーバ既定のエンコーディングが使用されます。
Note:
このプロパティを設定する場合、まず、ContentType プロパティを設定する必要があります。
-
NoDefaultContentCharset プロパティは、ContentCharset プロパティを設定していない場合、text タイプのコンテンツの明示的な文字セットを含めるかどうかを制御します。既定では、このプロパティは、False です。
このプロパティが True の場合、text タイプのコンテンツがあり、ContentCharset プロパティが設定されていなければ、コンテンツ・タイプに文字セットは含まれません。つまり、iso-8859-1 文字セットがメッセージの出力に使用されます。
-
WriteRawMode プロパティは、エンティティ本文に影響を与えます (含まれる場合)。これは要求の本文の記述方法を制御します。既定では、このプロパティは False であり、要求ヘッダで指定されたエンコーディングで本文に記述されます。このプロパティが True の場合、本文が RAW モードで記述されます (文字セットの変換は行いません)。
-
ReadRawMode プロパティは、応答の本文の読み取り方法を制御します。既定では、このプロパティは False であり、本文が応答ヘッダで指定された文字セットであると見なされます。このプロパティが True の場合、本文が RAW モードで読み取られます (文字セットの変換は行いません)。
プロキシ・サーバの使用法
プロキシ・サーバにより、HTTP 要求を送信できます。これを設定するには、HTTP 要求の以下のプロパティを指定します。
-
ProxyServer では、使用するプロキシ・サーバのホスト名を指定します。このプロパティが NULL でない場合、HTTP 要求はこのマシンに向けられます。
-
ProxyPort では、プロキシ・サーバ上の接続するポートを指定します。
-
ProxyAuthorization では、Proxy-Authorization ヘッダを指定します。ユーザ・エージェントがそれ自体をプロキシで認証する必要がある場合に設定する必要があります。値には、要求しているリソースのユーザ・エージェントが必要とする認証情報を使用します。“ログイン資格情報の提供” も参照してください。
-
ProxyHTTPS は、HTTP 要求が通常の HTTP ページではなく、HTTPS ページに対するものであるかどうかを制御します。このプロパティは、プロキシ・サーバを指定していない場合、無視されます。このプロパティでは、ターゲット・システムの既定ポートをプロキシ・ポートである 443 に変更します。“SSL を使用した接続” も参照してください。
-
ProxyTunnel では、プロキシ経由でターゲットの HTTP サーバへのトンネルを確立するかどうかを指定します。True の場合、要求は HTTP CONNECT コマンドを使用してトンネルを確立します。プロキシ・サーバのアドレスは、ProxyServer プロパティと ProxyPort プロパティから取得されます。ProxyHttps が True の場合、トンネルが確立されたときに InterSystems IRIS が SSL 接続をネゴシエートします。この場合、トンネルによってターゲット・システムとの直接接続が確立されるため、Https プロパティは無視されます。
詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
SSL を使用した接続
%Net.HttpRequestOpens in a new tab クラスは、SSL 接続をサポートします。SSL によって要求を送信する手順は以下のとおりです。
-
SSLConfiguration プロパティを使用する有効化した SSL/TLS 構成の名前に設定します。
SSL/TLS 構成の作成と管理の詳細は、"InterSystems TCP ガイド" を参照してください。SSL/TLS 構成には、[構成名] と呼ばれるオプションが含まれています。これは、この設定で使用する文字列です。
-
プロキシ・サーバを使用しているかどうかによって、以下のいずれかを行います。
-
プロキシ・サーバを使用していない場合、Https プロパティを True に設定します。
-
プロキシ・サーバを使用している場合、ProxyHTTPS プロパティを True に設定します。
この場合、プロキシ・サーバ自体への SSL 接続を使用するため、Https プロパティを True に設定します。
指定のサーバへの SSL 接続を使用する場合、そのサーバでの既定ポートは 443 (HTTPS ポート) と見なされます。例えば、プロキシ・サーバを使用しておらず、Https が True の場合、これによって、既定の Port プロパティが 443 に変更されます。
“プロキシ・サーバの使用法” も参照してください。
HTTPVersion、Timeout、WriteTimeout、および FollowRedirect プロパティ
%Net.HttpRequestOpens in a new tab には、以下のプロパティもあります。
-
HTTPVersion は、ページを要求するときに使用する HTTP のバージョンを指定します。既定値は "HTTP/1.1" です。また、"HTTP/1.0" も使用できます。
-
Timeout では、Web サーバからの応答を待機する時間を秒単位で指定します。既定値は 30 秒です。
-
WriteTimeout では、Web サーバの書き込み完了を待機する時間を秒単位で指定します。既定では無限に待機します。指定できる最小値は 2 秒です。
-
FollowRedirect では、(300 ~ 399 の範囲の HTTP 状態コードによって示される) Web サーバからのリダイレクト要求に自動的に従うかどうかを指定します。既定値は、GET または HEAD を使用している場合は True、それ以外の場合は False です。
HTTP 要求の既定値の指定
%Net.HttpRequestOpens in a new tab のすべてのプロパティの既定値を指定できます。
-
すべてのネームスペースに適用する既定値を指定するには、グローバル・ノード ^%SYS("HttpRequest","propname") を設定します。"propname" は、プロパティの名前です。
-
1 つのネームスペースに適用する既定値を指定するには、そのネームスペースに移動し、ノード ^SYS("HttpRequest","propname") を設定します。
(^%SYS グローバルはインストール全体に、^SYS グローバルは現在のネームスペースに影響を及ぼします。)
例えば、すべてのネームスペースに既定のプロキシ・サーバを指定するには、グローバル・ノード ^%SYS("HttpRequest","ProxyServer") を設定します。
キープ・アライブ動作の管理
%Net.HttpRequestOpens in a new tab の同じインスタンスを再利用して、複数の HTTP 要求を送信する場合、既定により、InterSystems IRIS は TCP/IP ソケットのオープン状態を維持するので、閉じてから再び開く必要はありません。
TCP/IP ソケットを再利用する必要がない場合、SocketTimeout プロパティを 0 に設定します。
%Net.HttpRequestOpens in a new tab の SocketTimeout プロパティにより、指定されたソケットを InterSystems IRIS で再利用する予定期間の時間ウィンドウを秒単位で指定します。このタイムアウトには、ファイアウォールにより密かに閉じられた可能性のあるソケットの使用を避ける目的があります。このプロパティの既定値は 115 です。このプロパティには、別の値を設定できます。
HTTP 要求のパラメータの処理
HTTP 要求を送信する際 (“HTTP 要求の送信” を参照)、パラメータを location 引数で指定できます。例えば、"/test.html?PARAM=%25VALUE" は、PARAM を %VALUE に設定します。
以下のメソッドを使用して、%Net.HttpRequestOpens in a new tab のインスタンスがパラメータを処理する方法を制御することもできます。
InsertParam()
要求にパラメータを挿入します。このメソッドは、パラメータ名とパラメータの値の 2 つの文字列引数を取ります。以下はその例です。
do req.InsertParam("arg1","1")
指定のパラメータに対して、複数の値を挿入できます。その場合、値は、1 で始まる添え字を受け取ります。その他のメソッド内で、これらの添え字を使用して、目的の値を参照します。
DeleteParam()
要求からパラメータを削除します。最初の引数は、パラメータの名前です。2 番目の引数は、削除する値の添え字です。同じパラメータに対して複数の値が要求に含まれている場合にのみこれを使用します。
CountParam()
指定のパラメータに関連付けられた値の数を数えます。
GetParam()
要求内の指定のパラメータの値を取得します。最初の引数は、パラメータの名前です。2 番目の引数は、要求にこの名前のパラメータがない場合に返す既定値です。この既定値の初期値は、NULL 値です。3 番目の引数は、取得する値の添え字です。同じパラメータに対して複数の値が要求に含まれている場合にのみこれを使用します。
IsParamDefined()
指定のパラメータが定義されているかどうかを確認します。このメソッドは、パラメータに値がある場合、True を返します。この引数は、DeleteParam() のものと同じです。
NextParam()
$Order() によってパラメータ名を並べ替えた後で、次にパラメータがある場合は、その名前を取得します。
詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
要求の本文を含める
HTTP 要求には、要求の本文またはフォーム・データのいずれかを含めることができます。要求の本文を含める手順は以下のとおりです。
-
%GlobalBinaryStreamOpens in a new tab のインスタンスまたはサブクラスを作成します。HTTP 要求の EntityBody プロパティにはこのインスタンスを使用します。
-
データをこのストリームに書き込むには、標準のストリーム・インタフェースを使用します。以下はその例です。
Do oref.EntityBody.Write("Data into stream")
例えば、ファイルを読み取り、それをカスタム HTTP 要求のエンティティ本文として使用できます。
set file=##class(%File).%New("G:\customer\catalog.xml")
set status=file.Open("RS")
if $$$ISERR(status) do $System.Status.DisplayError(status)
set hr=##class(%Net.HttpRequest).%New()
do hr.EntityBody.CopyFrom(file)
do file.Close()
チャンクされた要求の送信
HTTP 1.1 を使用すると、HTTP要求をチャンクで送信できます。これには、Transfer-Encoding を設定してメッセージがチャンクされていることを示し、0 サイズのチャンクを使用して完了を示す必要があります。
チャンク・エンコードは、サーバが大量のデータを返しており、要求が完全に処理されるまで応答の合計サイズが分からない場合に便利です。そのような場合、通常、コンテンツの長さが計算できるまで (これは、%Net.HttpRequestOpens in a new tab が自動的に行います)、メッセージ全体をバッファする必要があります。
チャンクされた要求を送信する手順は以下のとおりです。
-
データをチャンクで書き込むためのインタフェースを定義する抽象ストリーム・クラスである、%Net.ChunkedWriterOpens in a new tab のサブクラスを作成します。
このサブクラス内に、OutputStream() メソッドを実装します。
-
%Net.HttpRequestOpens in a new tab のインスタンスで、%Net.ChunkedWriterOpens in a new tab サブクラスのインスタンスを作成し、送信する要求データを入力します。
-
%Net.HttpRequestOpens in a new tab インスタンスの EntityBody プロパティを %Net.ChunkedWriterOpens in a new tab のこのインスタンスと等しくなるように設定します。
HTTP 要求を送信すると (“HTTP 要求の送信” を参照)、EntityBody プロパティの OutputStream() メソッドが呼び出されます。
%Net.ChunkedWriterOpens in a new tab のサブクラスで、OutputStream() メソッドはストリーム・データを調べ、これをチャンクするかどうかとその方法を決定し、クラスの継承されたメソッドを呼び出して出力を記述します。
以下のメソッドを使用できます。
WriteSingleChunk()
文字列の引数を受け入れ、この文字列を非チャンク出力として記述します。
WriteFirstChunk()
文字列引数を受け入れます。適切な Transfer-Encoding ヘッダを記述してチャンクされたメッセージを示し、続いて、その文字列を最初のチャンクとして記述します。
WriteChunk()
文字列の引数を受け入れ、この文字列をチャンクとして記述します。
WriteLastChunk()
文字列の引数を受け入れ、文字列をチャンクとして記述し、続いて、終了を表す長さが 0 のチャンクを記述します。
NULL でない場合、TranslateTable プロパティは、記述する際に各文字列の変換に使用する変換テーブルを指定します。前述のメソッドはすべてこのプロパティを確認します。
HTTP 要求の送信
HTTP 要求を作成した後、以下のメソッドのいずれかを使用してこの HTTP 要求を送信します。
Delete()
method Delete(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP DELETE 要求を発行します。
Get()
method Get(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP GET 要求を発行します。このメソッドにより、Web サーバは要求されたページを返します。
Head()
method Head(location As %String,
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP HEAD 要求を発行します。このメソッドにより、Web サーバは応答のヘッダのみを返します。本文は返しません。
Patch()
method Patch(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP PATCH 要求を発行します。既存のリソースに部分的な変更を加える場合にこのメソッドを使用します。
Post()
method Post(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP POST 要求を発行します。フォームの結果などのデータを Web サーバに送信したり、ファイルをアップロードするには、このメソッドを使用します。使用例は、“フォーム・データの送信” を参照してください。
Put()
method Put(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP PUT 要求を発行します。データを Web サーバにアップロードするには、このメソッドを使用します。PUT 要求は通常ありません。
Send()
method Send(type As %String,
location As %String,
test As %Integer = 0,
reset As %Boolean = 1) as %Status
指定されたタイプの HTTP 要求をサーバに送信します。このメソッドは、通常、他のメソッドによって呼び出されますが、異なる HTTP 動詞を使用したい場合に使用するために用意されています。ここでは、type は、"POST" などの HTTP 動詞を指定する文字列です。
いずれの場合も、
-
各メソッドはステータスを返すので、それを確認する必要があります。
-
メソッドが正しく完了すると、この要求に対する応答が HttpResponse プロパティに追加されます。
-
location 引数は、要求する URL です。例えば、"/test.html" です。
-
location 引数では、既に URL エスケープされていると見なすことができるパラメータを指定できます。例えば、"/test.html?PARAM=%25VALUE" は、PARAM を %VALUE に設定します。
-
送信する予定のものを送信していることを確認するには、test 引数を使用します。
-
各メソッドは、test=1 または、reset=0 の場合を除いて、応答をサーバから読み取った後に、自動的に Reset() メソッドを呼び出します。
Reset() メソッドは、別の要求を発行できるように、%Net.HttpRequestOpens in a new tab インスタンスをリセットします。これは、このオブジェクトを閉じて、新規インスタンスを作成するよりもはるかに速いです。また、これは、Location ヘッダの値を Referer ヘッダに移動します。
以下はその例です。
Set httprequest=##class(%Net.HttpRequest).%New()
Set httprequest.Server="www.intersystems.com"
Do httprequest.Get("/")
他の例については、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
マルチパート POST 要求の作成と送信
マルチパート POST 要求の作成と送信を行うには、%Net.MIMEPartOpens in a new tab クラスを使用します。詳細は、このドキュメントで後述します。以下の例では、2 つの部分を有する POST 要求を送信します。最初の部分はファイルのバイナリ・データ、2 番目の部分はファイル名を含んでいます。
ClassMethod CorrectWriteMIMEMessage3(header As %String)
{
// Create root MIMEPart
Set RootMIMEPart=##class(%Net.MIMEPart).%New()
//Create binary subpart and insert file data
Set BinaryMIMEPart=##class(%Net.MIMEPart).%New()
Set contentdisp="form-data; name="_$CHAR(34)_"file"_$CHAR(34)_"; filename="
_$CHAR(34)_"task4059.txt"_$CHAR(34)
Do BinaryMIMEPart.SetHeader("Content-Disposition",contentdisp)
Set stream=##class(%FileBinaryStream).%New()
Set stream.Filename="/home/tabaiba/prueba.txt"
Do stream.LinkToFile("/home/tabaiba/prueba.txt")
Set BinaryMIMEPart.Body=stream
Do BinaryMIMEPart.SetHeader("Content-Type","text/plain")
// Create text subpart
Set TextMIMEPart=##class(%Net.MIMEPart).%New()
Set TextMIMEPart.Body=##class(%GlobalCharacterStream).%New()
Do TextMIMEPart.Body.Write("/home/tabaiba/prueba.txt")
// specify some headers
Set TextMIMEPart.ContentType="text/plain"
Set TextMIMEPart.ContentCharset="us-ascii"
Do TextMIMEPart.SetHeader("Custom-header",header)
// Insert both subparts into the root part
Do RootMIMEPart.Parts.Insert(BinaryMIMEPart)
Do RootMIMEPart.Parts.Insert(TextMIMEPart)
// create MIME writer; write root MIME message
Set writer=##class(%Net.MIMEWriter).%New()
// Prepare outputting to the HttpRequestStream
Set SentHttpRequest=##class(%Net.HttpRequest).%New()
Set status=writer.OutputToStream(SentHttpRequest.EntityBody)
if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit}
// Now write down the content
Set status=writer.WriteMIMEBody(RootMIMEPart)
if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit}
Set SentHttpRequest.Server="congrio"
Set SentHttpRequest.Port = 8080
Set ContentType= "multipart/form-data; boundary="_RootMIMEPart.Boundary
Set SentHttpRequest.ContentType=ContentType
set url="alfresco/service/sample/upload.json?"
_"alf_ticket=TICKET_caee62bf36f0ea5bd51194fce161f99092b75f62"
set status=SentHttpRequest.Post(url,0)
if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit}
}
HTTP 応答へのアクセス
HTTP 要求を送信後、要求の HttpResponse プロパティが更新されます。このプロパティは、%Net.HttpResponseOpens in a new tab のインスタンスです。ここでは、応答オブジェクトの使用法について説明します。ここでは、以下のトピックについて説明します。
詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
応答のデータへのアクセス
HTTP 応答の本文は、応答の Data プロパティに含まれています。このプロパティには、ストリーム・オブジェクト (具体的には %GlobalBinaryStreamOpens in a new tab) が含まれています。このストリームを使用するには、標準ストリーム・メソッドである Write()、WriteLine()、Read()、ReadLine()、Rewind()、MoveToEnd()、および Clear() を使用します。また、ストリームの Size プロパティも使用できます。
要求 の ReadRawMode プロパティは、応答の本文を読み取る方法を制御します。
また、OutputToDevice() メソッドを使用して、完全な応答を現在のデバイスに書き込むこともできます。ヘッダは、Web サーバによって生成された順序と同じ順序ではありません。
以下の簡単な例では、応答ストリームをファイルにコピーして保存します。
set request=##class(%Net.HttpRequest).%New()
set request.Server="tools.ietf.org"
set request.Https=1
set request.SSLConfiguration="TEST"
set status=request.Get("/html/rfc7158")
if $$$ISERR(status) {
do $system.OBJ.DisplayError()
} else {
set response=request.HttpResponse
}
Set file=##class(%FileCharacterStream).%New()
set file.Filename="c:/temp/rfc7158.html"
set status=file.CopyFrom(response.Data)
if $$$ISERR(status) {
do $system.OBJ.DisplayError()
}
do file.%Close()
応答に関するその他の情報へのアクセス
%Net.HttpResponseOpens in a new tab クラスは、HTTP 応答のその他の特定の部分を保存するプロパティを提供します。
-
StatusLine は、応答の第 1 行目の HTTP ステータス行を保存します。
-
StatusCode は、HTTP ステータス・コードを保存します。
-
ReasonPhrase は、StatusCode に相当する人間が読める形式の理由を保存します。
-
ContentInfo は、応答本文についての追加情報を保存します。
-
ContentType は、Content-Type: ヘッダの値を保存します。
-
HttpVersion は、応答を送信した Web サーバがサポートする HTTP のバージョンを示します。