【IRIS/Cache】そうだWebアプリケーションを作ろう -クッキー焼いたろ!

本記事では、ObjectScriptの%Net.HttpRequestを利用し、Cookieを送受信する方法について解説します

※この記事は下記の方向けになります。
  • ObjectScriptのHTTP通信でCookieの焼き方を知りたい方
  • ObjectScriptでとことんやってみたい方

はじめに

WebアプリケーションやREST APIとの通信では、リクエストとレスポンスのやり取りだけでなく、セッション情報やユーザー状態を維持する仕組みが欠かせません。
その代表的な手段が「Cookie」です。

ObjectScriptでは、[%Net.HttpRequest]や[%CSP.パッケージ]に「Cookieを受け取る仕組み」と「Cookieをリクエストに添付する仕組み」の両方が備わっています。
これにより、外部APIと安全かつ効率的にやり取りを行うことが可能です。

本記事では、ObjectScriptでのCookieの取り扱いにフォーカスし、送信・受信の方法をサンプルコードと共に解説してきます。

Cookieを送る

先ずは、Cookieを焼くところから始めます。

%Net.HttpReauest

%Net.HttpRequestでCookieを送信するには、「InsertCookie()」を使用します。

s http=##class(%Net.HttpRequest).%New()
d http.InsertCookie([name], [value], [path], [domain], [expires],[])
No項目名説明
1nameCookieに格納する項目名
2valueCookieに格納する値
3path適用されるウェブサイトのパスを指定
4domain有効なドメイン(ウェブサイトの所有権)を指定
5expires有効期間を設定($horolog型)
6secure安全なHTTPS通信の場合にのみサーバーに送信

expirsに関しては、$system.SQL.DATEADD()を使用すると、楽に取得できます。

下記サンプルは、有効期間を8時間後に設定します。

s expirs = $zdth( $SYSTEM.SQL.DATEADD("hour", 8, $h), 3, 1 )

第一引数は、「second」「minute」「day」「month」「year」等が指定できます。

■Cookie送信サンプル
サンプルとして、color=black, test=sampleを送信しています。

s http=##class(%Net.HttpRequest).%New()

s http.Server = "localhost"
, http.Port = 80
, http.Timeout = 60

// Cookie設定
w !,"-----------"
w !,"[cookie]"
s time = $SYSTEM.SQL.DATEADD("day", 2, $h)
w !,time,!
	
d http.InsertCookie("color", "black", "/restTest", "localhost", $zdth(time,3,1))
d http.InsertCookie("test", "sample", "/restTest", "localhost", $zdth(time,3,1))
d http.GetFullCookieList(.cookie)

s name = $zcvt("山田 太郎","O", "URL")
s path = $$$FormatText("http://localhost/restTest/sample/%1?no=%2&name=%3", id, no, name)
s sts = http.Get(path)

%CSP.Response

RESTサービス側では、「%response.SetCookie()」を使用してCookieを送信します。

d %response.SetCookie([name],[valuie],[expires],[path],[domein])

内容は%Net.HttpRequestと同じですが、expiresの設定値が異なり「Wdy, DD-Mon-YYYY HH:MM:SS GMT」で設定します。

s h = $ZTimeStamp
s expires = $zd(h, 12)_", "_$tr($zd(+h, 2), " ", "-")_" "_$zt($p(h, ",", 2))_" GMT"
w expires

【実行結果】
Friday, 05-Sep-2025 09:23:53 GMT

日付の設定が少し面倒です。

■Cookie送信サンプル
サンプルとしてloginuser=test name, foo=hogeを送信しています。

s h = $ZTimeStamp
s expires = $zd(h, 12)_", "_$tr($zd(+h, 2), " ", "-")_" "_$zt($p(h, ",", 2))_" GMT"

d %response.SetCookie("loginuser", "test name", expires)
d %response.SetCookie("foo", "hoge", expires)

Cookieを受け取る

Cookieを送る事ができたので、今度は送ったCookieを受け取りましょう。

%Net.HttpReauest

Cookieの受け取りは、.HttpResponseから「%Net.HttpResponse」を取得します。

後は、Headerの「SET-COOKIE」から取得する流れです。

s req = http.HttpResponse // %Net.HttpResponse取得
s cookie = req.GetHeader("SET-COOKIE")
f pos=1:1:$l(cookie,";,"){
	s piece = $p($p(cookie,";,",pos),";",1)
	s name = $p(piece, "=")
	, value = $e(piece, $l(name)+2, *)
	w !,$$$FormatText("name=%1, value=%2",name, value)
}

1つの文字列としてCookieを取得するので、項目毎に分解するのは手作業になります。
すこし面倒です。

%CSP.Response

RESTサービス内では、%requestから「.GetCookie(name, cnt)」で取得します。

s name = ""
f { s cookie=%request.NextCookie(name) q:name=""
	f cnt = 1:1: %request.CountCookie(name) {
		s value = %request.GetCookie(name, cnt)
		w !,$$$FormatText("name=%1, value=%2",name, value)
	}
}

こっちの方は、各項目毎に取得できるので、比較的簡単に取得できます。

おわりに

以上、ObjectScriptにおけるHTTP通信でのCookieの取り扱い方法についてご紹介しました。

まとめ
  • クライアント側では、%Net.HttpRequest.InsertCookie()を使ってCookieを送信し、%Net.HttpResponseからHeaderを解析することでCookieを受け取ります。
  • サーバ側では、%response.SetCookie()でCookieを設定し、%request.GetCookie()で取得できます。

一見すると、クライアント側は文字列処理が必要で少し煩雑ですが、仕組みを理解してしまえば応用範囲は広く、API認証やセッション管理など様々な場面で役立ちます。

今後、より高度な認証やセキュリティ管理を行う際にも、今回の基本的なCookie操作の知識はきっと役立つはずです。

ぜひ実際の環境で試してみてください。