HTTP 要求の送信
ここでは、HTTP 要求 (POST や GET など) の送信方法について説明します。
HTTP 要求の概要
%Net.HttpRequestOpens in a new tab のインスタンスを作成して、さまざまな種類の HTTP 要求を送信し、応答を受信します。このオブジェクトは、Web ブラウザと同等であり、このオブジェクトを使用して、複数の要求を行うことができます。自動的に正しい Cookie が送信され、必要に応じて Referer ヘッダが設定されます。
HTTP 要求を作成するには、以下の一般的なプロセスを使用します。
-
%Net.HttpRequestOpens in a new tab のインスタンスを作成します。
-
このインスタンスのプロパティを設定し、通信する Web サーバを指定します。基本的なプロパティは以下のとおりです。
-
Server では、Web サーバの IP アドレスまたはマシン名を指定します。既定値は localhost です。
Note:Server の値の一部として http:// や https:// を含めないでください。これらを含めると、「エラー #6059 : サーバ http:/ の TCP/IP ソケットを開くことができません」が発生します。
-
Port では、接続先のポートを指定します。既定値は 80 です。
-
-
必要に応じて、"HTTP 要求のその他のプロパティの指定" で説明されているとおり、HTTP 要求のその他のプロパティと呼び出しメソッドを設定します。
-
その後、"HTTP 要求の送信" で説明されているとおり、%Net.HttpRequestOpens in a new tab のインスタンスの Get() メソッドまたはその他のメソッドを呼び出し、HTTP 要求を送信します。
インスタンスから複数の要求を行うことができ、それによって、Cookie および Referer ヘッダが自動的に処理されます。
Note:プロダクションの発信アダプタ (EnsLib.HTTP.OutboundAdapterOpens in a new tab) で使用するためにこの HTTP 要求を作成した場合は、代わりにそのアダプタのメソッドを使用して要求を送信します。
-
%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.0 を使用する場合の要求の認証
HTTP 1.0 の場合に HTTP 要求を認証するには、%Net.HttpRequestOpens in a new tab.のインスタンスの Username プロパティと Password プロパティを設定します。このインスタンスでは次に、Basic アクセス認証 (RFC 2617Opens in a new tab) を使用して、そのユーザ名とパスワードに基づいて HTTP Authorization ヘッダが作成されます。この %Net.HttpRequestOpens in a new tab から送信される以降の要求に、このヘッダが含まれるようになります。
SSL も使用していることを確認してください ("SSL を使用した接続" を参照)。Basic 認証では、資格情報は Base 64 のエンコード形式で送信されるため、簡単に読み取ることができます。
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 の場合とは詳細が異なります。
-
認証が成功すると、最新の認証に使用された認証スキームを示すように、InterSystems IRIS は %Net.HttpRequestOpens in a new tab インスタンスの CurrentAuthenticationScheme プロパティを更新します。
-
スキームの認証ハンドルまたはトークンを取得しようとして失敗した場合、InterSystems IRIS は原因となっているエラーを %Net.HttpRequestOpens in a new tab インスタンスの AuthenticationErrors プロパティに保存します。このプロパティの値は $LIST で、各項目が scheme ERROR: message の形式になっています。
Negotiate と NTLM は HTTP 1.1 でのみサポートされています。これらのスキームには複数回の往復が必要ですが、HTTP 1.0 では要求と応答の各ペアの後に接続を閉じる必要があるからです。
バリエーション
サーバで許可される認証スキームがわかっている場合は、選択したスキームのサーバ用の初期トークンが含まれる Authorization ヘッダを含めることによって、サーバからの最初の往復をバイパスできます。 このためには、%Net.HttpRequestOpens in a new tab インスタンスの InitiateAuthentication プロパティを設定します。このプロパティの値として、サーバで許可されている 1 つの認証スキームの名前を指定します。以下の値のいずれかを使用します (大文字と小文字が区別されます)。
-
Negotiate
-
NTLM
-
Basic
使用する認証スキームをカスタマイズする (または検討される順序を変更する) 場合は、%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 要求を送信しているとします。
この場合、以下の値を使用します。
プロパティ | 値 |
---|---|
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 に変更されます。
"プロキシ・サーバの使用法" も参照してください。
サーバ ID の確認
既定では、%Net.HttpRequestOpens in a new tab のインスタンスは、SSL/TLS でセキュリティ保護された Web サーバに接続するときに、証明書サーバ名と、そのサーバへの接続に使用した DNS 名が一致しているかどうかを確認します。これらの名前が一致していないと、接続は許可されません。この既定の動作は、“中間者” 攻撃を防止するもので、RFC 2818Opens in a new tab のセクション 3.1 に説明があります。また、RFC 2595Opens in a new tab のセクション 2.4 も参照してください。
この確認を無効にするには、SSLCheckServerIdentity プロパティを 0 に設定します。
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") を設定します。
HTTP ヘッダの設定と取得
HTTP ヘッダの値を設定および取得できます。
%Net.HttpRequestOpens in a new tab の以下の各プロパティには、対応する名前を持つ HTTP ヘッダの値が含まれます。これらのプロパティを設定しなかった場合、これらは自動的に計算されます。
-
Authorization
-
ContentEncoding
-
ContentLength (このプロパティは読み取り専用です。)
-
ContentType (Content-Type ヘッダのインターネット・メディア・タイプOpens in a new tab (MIME タイプ) を指定します。)
-
ContentCharset (Content-Type ヘッダの charset 部分を指定します。これを設定する場合、まず、ContentType プロパティを設定する必要があります。)
-
Date
-
From
-
IfModifiedSince
-
Pragma
-
ProxyAuthorization
-
Referer
-
UserAgent
%Net.HttpRequestOpens in a new tab クラスは、主要 HTTP ヘッダの設定および取得に使用できる一般的なメソッドを提供します。これらのメソッドは、Content-Type およびその他のエンティティ・ヘッダを無視します。
この要求の主要 HTTP ヘッダを含む文字列を返します。
現在のデバイスに主要 HTTP ヘッダを書き込みます。
この要求に設定されているすべての主要 HTTP ヘッダの現在の値を取得します。このメソッドは、1 つの引数、すなわちヘッダ名を取ります (大文字と小文字を区別しない)。これは、Host や Date などの文字列です。
ヘッダの値を設定します。通常は、これを使用して、標準以外のヘッダを設定します。通常のほとんどのヘッダは、Date などのプロパティによって設定されます。このメソッドは、以下の 2 つの引数を取ります。
-
コロン (:) の区切り文字のないヘッダの名前 (大文字と小文字を区別しない)。これは、Host や Date などの文字列です。
-
そのヘッダの値
このメソッドを使用して、エンティティ・ヘッダまたは読み取り専用のヘッダ (Content-Length および Connection) を設定することはできません。
詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
キープ・アライブ動作の管理
%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 のインスタンスがパラメータを処理する方法を制御することもできます。
要求にパラメータを挿入します。このメソッドは、パラメータ名とパラメータの値の 2 つの文字列引数を取ります。以下はその例です。
do req.InsertParam("arg1","1")
指定のパラメータに対して、複数の値を挿入できます。その場合、値は、1 で始まる添え字を受け取ります。その他のメソッド内で、これらの添え字を使用して、目的の値を参照します。
要求からパラメータを削除します。最初の引数は、パラメータの名前です。2 番目の引数は、削除する値の添え字です。同じパラメータに対して複数の値が要求に含まれている場合にのみこれを使用します。
指定のパラメータに関連付けられた値の数を数えます。
要求内の指定のパラメータの値を取得します。最初の引数は、パラメータの名前です。2 番目の引数は、要求にこの名前のパラメータがない場合に返す既定値です。この既定値の初期値は、NULL 値です。3 番目の引数は、取得する値の添え字です。同じパラメータに対して複数の値が要求に含まれている場合にのみこれを使用します。
指定のパラメータが定義されているかどうかを確認します。このメソッドは、パラメータに値がある場合、True を返します。この引数は、DeleteParam() のものと同じです。
$Order() によってパラメータ名を並べ替えた後で、次にパラメータがある場合は、その名前を取得します。
この要求に含まれるパラメータのリストを返します。
詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
要求の本文を含める
HTTP 要求には、要求の本文またはフォーム・データのいずれかを含めることができます。要求の本文を含める手順は以下のとおりです。
-
%GlobalBinaryStreamOpens in a new tab のインスタンスまたはサブクラスを作成します。HTTP 要求の EntityBody プロパティにはこのインスタンスを使用します。
%GlobalBinaryStreamOpens in a new tab は非推奨になっていますが、このような使用法は引き続きサポートされています。このユース・ケースで別のストリーム・クラスに置き換えることはお勧めできません。
-
データをこのストリームに書き込むには、標準のストリーム・インタフェースを使用します。以下はその例です。
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() メソッドはストリーム・データを調べ、これをチャンクするかどうかとその方法を決定し、クラスの継承されたメソッドを呼び出して出力を記述します。
以下のメソッドを使用できます。
文字列の引数を受け入れ、この文字列を非チャンク出力として記述します。
文字列引数を受け入れます。適切な Transfer-Encoding ヘッダを記述してチャンクされたメッセージを示し、続いて、その文字列を最初のチャンクとして記述します。
文字列の引数を受け入れ、この文字列をチャンクとして記述します。
文字列の引数を受け入れ、文字列をチャンクとして記述し、続いて、終了を表す長さが 0 のチャンクを記述します。
NULL でない場合、TranslateTable プロパティは、記述する際に各文字列の変換に使用する変換テーブルを指定します。前述のメソッドはすべてこのプロパティを確認します。
フォーム・データの送信
HTTP 要求には、要求の本文またはフォーム・データのいずれかを含めることができます。フォーム・データを含めるには、以下のメソッドを使用します。
要求にフォーム・データを挿入します。このメソッドは、フォーム項目名と関連付けられた値の 2 つの文字列引数を取ります。指定のフォーム項目に複数の値を挿入できます。その場合、値は、1 で始まる添え字を受け取ります。その他のメソッド内で、これらの添え字を使用して、目的の値を参照します。
要求からフォーム・データを削除します。最初の引数は、フォーム項目の名前です。2 番目の引数は、削除する値の添え字です。同じフォーム項目に対して複数の値が要求に含まれている場合にのみこれを使用します。
要求内の指定の名前に関連付けられた値の数を数えます。
指定の名前が定義されているかどうかを確認します。
$Order() によってパラメータ名を並べ替えた後で、次にフォーム項目がある場合は、その名前を取得します。
これらのメソッドの詳細は、%Net.HttpRequestOpens in a new tab のクラス・ドキュメントを参照してください。
例 1
フォーム・データを挿入後、通常、Post() メソッドを呼び出します。以下はその例です。
Do httprequest.InsertFormData("element","value")
Do httprequest.Post("/cgi-bin/script.CGI")
例 2
別の例を示します。
Set httprequest=##class(%Net.HttpRequest).%New()
set httprequest.SSLConfiguration="MySSLConfiguration"
set httprequest.Https=1
set httprequest.Server="myserver.com"
set httprequest.Port=443
Do httprequest.InsertFormData("portalid","2000000")
set tSc = httprequest.Post("/url-path/")
Quit httprequest.HttpResponse
HTTP 要求の送信
HTTP 要求を作成した後、以下のメソッドのいずれかを使用してこの HTTP 要求を送信します。
method Delete(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP DELETE 要求を発行します。
method Get(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP GET 要求を発行します。このメソッドにより、Web サーバは要求されたページを返します。
method Head(location As %String,
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP HEAD 要求を発行します。このメソッドにより、Web サーバは応答のヘッダのみを返します。本文は返しません。
method Patch(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP PATCH 要求を発行します。既存のリソースに部分的な変更を加える場合にこのメソッドを使用します。
method Post(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP POST 要求を発行します。フォームの結果などのデータを Web サーバに送信したり、ファイルをアップロードするには、このメソッドを使用します。使用例は、"フォーム・データの送信" を参照してください。
method Put(location As %String = "",
test As %Integer = 0,
reset As %Boolean = 1) as %Status
HTTP PUT 要求を発行します。データを Web サーバにアップロードするには、このメソッドを使用します。PUT 要求は通常ありません。
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 の場合、メソッドは、リモート・マシンに接続するのではなく、単に Web サーバに送信したはずのものを現在のデバイスに出力します。
-
test が 2 の場合、HTTP 要求を発行後、応答を現在のデバイスに出力します。
-
-
各メソッドは、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 のインスタンスです。このオブジェクトの使用法の詳細は、"HTTP 応答の使用法" を参照してください。