
本記事では、ObjectScriptの%Net.HttpRequestを利用し、Cookieを送受信する方法について解説します
はじめに
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 | 項目名 | 説明 |
|---|---|---|
| 1 | name | Cookieに格納する項目名 |
| 2 | value | Cookieに格納する値 |
| 3 | path | 適用されるウェブサイトのパスを指定 |
| 4 | domain | 有効なドメイン(ウェブサイトの所有権)を指定 |
| 5 | expires | 有効期間を設定($horolog型) |
| 6 | secure | 安全な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の取り扱い方法についてご紹介しました。
一見すると、クライアント側は文字列処理が必要で少し煩雑ですが、仕組みを理解してしまえば応用範囲は広く、API認証やセッション管理など様々な場面で役立ちます。
今後、より高度な認証やセキュリティ管理を行う際にも、今回の基本的なCookie操作の知識はきっと役立つはずです。
ぜひ実際の環境で試してみてください。

