【IRIS/Cache】そうだWebアプリケーションを作ろう -ObjectScriptで疎通テスト

本記事は、ObjectScriptで前回作成したRESTサービスの動作確認をObjectScriptで行います。

※この記事は下記の方向けになります。
  • ObjectScriptでのHTTP通信の実行方法について知りたい方
  • %Net.HttpRequest.clsの使い方
  • ObjectScriptで「なんでもやったるぜ」と意気込んでいる方

はじめに

今回は、RESTサービスの動作確認を行いたいと思います。

RESTサービスの疎通テストは、<Route>要素のメソッドが GET の場合であれば、ブラウザのURLを直接指定することで比較的簡単に確認できます。

また、POSTDELETE 等のメソッドについても、POSTMAN等のAPI開発ツールを利用すれば手軽にテストが可能です。

しかし、ここは本ブログの主旨に則り、ObjectScriptを使ってRESTサービスの動作確認を行ってみましょう。

それでは、さっそく確認していきます!

%Net.HttpRequestを使用する

ObjectScriptでRESTサービスへ疎通確認を行うには、「%Net.HttpRequest.cls」を利用します。

疎通確認のサンプルとして、下記エンドポイントを作成してみましょう。


http://localhost/restTest/sample2/666?no=777&name=山田 太郎

<Route>要素のMethodは「GET」なので、関数「Get()」を使用します。
第一引数は、Locationになります。

また、Getメソッドによる「パラメータ渡し」として、「no」と「name」をURLに追加しています。
 → URLの「?no=777&name=山田 太郎」部分

【サンプルPG】

Class developer.rest.ComTest
{
ClassMethod testGet(id As %Integer = 666, no As %Integer = 777)
{
	s http=##class(%Net.HttpRequest).%New()
	
	s http.Server = "localhost"
	, http.Port = 80
	, http.Timeout = 60
	
	s name = $zcvt("山田 太郎", "O", "URL") // エンコード
	s path = $$$FormatText("/restTest/sample2/%1?no=%2&name=%3", id, no, name)
	s sts = http.Get(path)
	
	s req = http.HttpResponse
	d req.OutputToDevice()
	
	w !,"-----------",!
	zw ^Rset.Sample
}
}

パラメータ渡しが追加されたので、RESTサービス・クラスの関数「test」も少し修正を行っております。

Class developer.rest.Sample Extends %CSP.REST
{

// ~ パラメータとUrlMapは略 ~

ClassMethod test(id As %Integer = "") As %Status
{
	s no = $g(%request.Data("no",1))
	, name = $g(%request.Data("name",1))
	
	k ^Rset.Sample
	s ^Rset.Sample("name")=$zcvt(name,"I", "URL") // デコード
	
	s ret = {
		"SessionId": (%session.SessionId),
		"ID":(id),
		"No":(no)
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
    q $$$OK
}
}

では実行してみましょう。
ターミナルで関数を実行すると、下記結果が得られます。

【実行結果】
HTTP/1.1 200 OK
CACHE-CONTROL: no-cache
CONTENT-LENGTH: 37
CONTENT-TYPE: application/json
DATE: Tue, 12 Aug 2025 00:48:51 GMT
EXPIRES: Thu, 29 Oct 1998 17:04:19 GMT
PRAGMA: no-cache
SERVER: Microsoft-IIS/10.0
X-POWERED-BY: ASP.NET

{“SessionId”:”1fagVNMMCM”,”ID”:”666″,”No”:”777“}

———–
^Rset.Sample(“name”)=”山田 太郎

・下記9行は「d req.OutputToDevice()」で出力した情報になります。

HTTP/1.1 200 OK
~~ 略 ~~
X-POWERED-BY: ASP.NET

・下記は、RESTサービス内の「d ##class(%REST.Impl).%WriteResponse(ret)」から出力しています。

{“SessionId”:”1fagVNMMCM”,”ID”:”666″,”No”:”777“}

・最後は、レスポンスが返ってきた時の出力「zw ^Rset.Sample」です。

^Rset.Sample(“name”)=”山田 太郎

パラメータで渡した値、戻り値も正常に取得できている事が確認できました。

POSTメソッド

次はPOSTメソッドを試したいと思います。

疎通確認用のPG作成

HTTP通信で、サーバへ情報を大量のデータを送信する際は登録する際に使用します。
また、パスワード等の他人にデータを見られたくない時にも重宝します。

上記性質のため、POSTメソッドでサーバにデータを送信する際は、リクエストボディにデータを記述します。

ObjectScriptでは、関数「InsertFormData(name, value)」を使用します。

今回は、下記エンドポイントに対しPOST通信を行いたいと思います。


http://localhost/restTest/test/postTest/666

【サンプルPG】

ClassMethod testPost(id As %Integer = 666, no As %Integer = 777)
{
	s http=##class(%Net.HttpRequest).%New()
	
	s http.Server = "localhost"
	, http.Port = 80
	, http.Timeout = 60
	
	d http.InsertFormData("no", no)
	, http.InsertFormData("name", $zcvt("山田 花子","O", "URL"))
	
	s sts = http.Post("/restTest/test/postTest/"_id)
	
	s req = http.HttpResponse
	d req.OutputToDevice()
	
	w !,"-----------",!
	zw ^Rset.Sample
}

RESTサービス・クラスを追記

POSTメソッドを受けるエンドポイントが無いので、developer.rest.Test.clsに新しい<Route>を作成します。

エンドポイントの最後の値は、「id」値として取得するように設定します。

【サンプルPG】

Class developer.rest.Test Extends %CSP.REST
{
~ 略 ~

XData UrlMap
{
<Routes>
<Route Url="/check" Method="GET" Call="check" Cors="true"/>
<Route Url="/postTest/:id" Method="POST" Call="postTest" Cors="true"/>
</Routes>
}

~ 略 ~

ClassMethod postTest(id As %Integer) As %Status
{
	s no = $g(%request.Data("no",1))
	, name = $g(%request.Data("name",1))
	
	k ^Rset.Sample
	s ^Rset.Sample("name")=$zcvt(name,"I", "URL")
	
	s ret = {
		"SessionId": (%session.SessionId),
		"clsNm" : "developer.rest.Test",
		"ID":(id),
		"No":(no)
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
	q $$$OK
}

}

では実行してみましょう。
ターミナルで関数を実行すると、下記結果が得られます。

【実行結果】
~ ヘッダ情報 略 ~

{“SessionId”:”xn06jPXkSH”,”clsNm”:”developer.rest.Test”,”ID”:”666″,”No”:”777“}

———–
^Rset.Sample(“name”)=”山田 花子

ストリームデータを送信する

POSTメソッドで大量のデータを送信する場合は、データをストリーム化して送信すると思います。
先ほどの関数を少し修正してみましょう。

【サンプルPG】

ClassMethod testPost(id As %Integer = 666, no As %Integer = 777)
{
	s http=##class(%Net.HttpRequest).%New()
	
	s http.Server = "localhost"
	, http.Port = 80
	, http.Timeout = 60
	
	// json形式をストリームで渡す
	s json = {
		"name": ($zcvt("山田 花子","O", "URL")),
		"no": (no)
	}
	s stm = ##class(%Stream.GlobalCharacter).%New()
	d json.%ToJSON(stm)
	s http.EntityBody = stm
	
	s sts = http.Post("/restTest/test/postTest/"_id)
	
	s req = http.HttpResponse
	d req.OutputToDevice()
	
	w !,"-----------",!
	zw ^Rset.Sample
}

RESTサービス・クラスでは、「Content」からストリームデータを取得し%DynamicObjectに変換します。

ClassMethod postTest(id As %Integer) As %Status
{
	s dt = {}.%FromJSON(%request.Content)
	s no = dt.no
	, name = dt.name
	
	k ^Rset.Sample
	s ^Rset.Sample("name")=$zcvt(name,"I", "URL")
	
	s ret = {
		"SessionId": (%session.SessionId),
		"clsNm" : "developer.rest.Test",
		"ID":(id),
		"No":(no)
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
	q $$$OK
}

実行結果は同じになるため、割愛します。

オリジナルメソッド

最後にオリジナルのメソッドで疎通確認を行ってみましょう。

オリジナルメソッド時は、関数「Send()」を使用します。
 →「Get()」も「Post()」も、最終的には「Send()」を実行しています。

【サンプルPG】

ClassMethod testOri(id As %Integer = 666, no As %Integer = 777)
{
	#dim json as %DynamicObject
	s http=##class(%Net.HttpRequest).%New()
	
	s http.Server = "localhost"
	, http.Port = 80
	, http.Timeout = 60
	
	d http.InsertFormData("no", no)
	, http.InsertFormData("name", $zcvt("山田 花子","O", "URL"))
	
	s sts = http.Send("ORI", "/restTest/test/original/"_id)
	
	s req = http.HttpResponse
	d req.OutputToDevice()
}

RESTサービス・クラスにも、Method=”ORI”の<Route>を追加します。

Class developer.rest.Test Extends %CSP.REST
{

~ パラメータ略 ~

XData UrlMap
{
<Routes>
<Route Url="/check" Method="GET" Call="check" Cors="true"/>
<Route Url="/postTest/:id" Method="POST" Call="postTest" Cors="true"/>
<Route Url="/original/:id" Method="ORI" Call="originalTest" Cors="true"/>
</Routes>
}

~ 関数略 ~

ClassMethod originalTest(id As %Integer) As %Status
{
	s no = $g(%request.Data("no",1))
	, name = $g(%request.Data("name",1))

	s ret = {
		"SessionId": (%session.SessionId),
		"clsNm" : "developer.rest.Test",
		"ID":(id),
		"No":(no)
	}
	d ##class(%REST.Impl).%WriteResponse(ret)
	q $$$OK
}
}

では実行してみましょう。
ターミナルで関数を実行すると、下記結果が得られます。

【実行結果】
~ ヘッダ情報 略 ~

{“SessionId”:”pd4Y58bbCK”,”clsNm”:”developer.rest.Test”,”ID”:”666″,”No”:”777“}

代り映えしませんが、疎通確認は行えました。

おわりに

いかがだったでしょうか。

ObjectScriptからHTTPリクエストを直接送ることで、外部ツール不要でREST APIの動作確認が可能になります。

これは単なる疎通確認だけでなく、リクエストパラメータや、JSONデータなどを細かく制御できるため、実運用に近い条件での検証が可能です。

特に開発中は、サービスの仕様変更やエンドポイント追加のたびにPOSTMANなどの外部ツールを立ち上げるのは手間ですが、ObjectScript内で完結すれば、スクリプト化や自動テストにも直結します。

本記事が、皆さまの実務や学びの中で、少しでもお役に立てれば幸いです。