
本記事は、ObjectScriptで前回作成したRESTサービスの動作確認をObjectScriptで行います。
はじめに
今回は、RESTサービスの動作確認を行いたいと思います。
RESTサービスの疎通テストは、<Route>要素のメソッドが GET の場合であれば、ブラウザのURLを直接指定することで比較的簡単に確認できます。
また、POST・DELETE 等のメソッドについても、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内で完結すれば、スクリプト化や自動テストにも直結します。
本記事が、皆さまの実務や学びの中で、少しでもお役に立てれば幸いです。

