CSPのセッションとRESTのセッションを共有する方法があることがわかりました。

UseSession=1に設定してCSPのアプリケーション名(/csp/hoge)でセッションクッキーを共有することで%sessionデータを共有できます。

RESTのアプリケーション定義を/csp/user/apiとして

UseSession=1に設定するとREST APIとCSP間で%sessionの共有ができることがわかりました。
(Parameter UseSession As Integer = 1;をクラス定義に含める)


セッションクッキーパスを/csp/user/という風にCSPアプリケーション名に合わせるのがかぎです。

cspクラスとして定義し、OnPageメソッドでJSON形式でデータを返すという方式ならば、%sessionを引き継げます。

これをREST APIと言うのは若干抵抗がありますが、そういっても間違いではないでしょう

RESTをとりあえずやめて以下のようなCSPクラスとして実装すると、正しく動作することが確認できました。
 

素晴らしいプログラミング能力ですね

Class Shop.AddEntry Extends %CSP.Page
{

ClassMethod OnPage() As %Status
{
  set status = $$$OK

  try {

    if $data(%request) {
      set %response.ContentType = "application/json"
      set %response.CharSet = "utf-8"
    }

    set return = {}

    // リクエストボディ(JSON)の読み取り
    set body = ##class(%DynamicObject).%FromJSON(%request.Content)
    set id     = body.id
    set amount = body.amount

    // 顧客情報の呼び出し
    if $get(%session.Data("oid")) = "" {
      set cust = ""
    }
    else {
      set cust = ##class(Shop.Customer).%OpenId(%session.Data("oid"))
    }
    if cust = "" {
      set return.LogoutMessage = "ログアウトされました。\n再度ログインしてください。"
      write return.%ToJSON()
      quit
    }

    // かごにエントリを追加・削除
    if +amount = 0 {
      // 個数が0の場合、かごにエントリがなければエラーを返す
      if '$data(%session.Data("basket", id)) {
        set return.ErrorMessage = "個数を入力してください"
        write return.%ToJSON()
        quit
      }
      // かごからエントリを削除
      kill %session.Data("basket", id)
    }
    else {
      // かごにエントリを追加
      set %session.Data("basket", id) = amount
    }

    // 注文件数の取得
    set id = "", count = 0
    for {
      set id = $order(%session.Data("basket", id))
      quit:id=""
      set id($increment(count)) = id
    }

    // 注文件数をセット
    set return.OrderLength = count

    // 注文IDと表示行の配列をセット
    set orderIds  = []
    set orderLines = []
    set total = 0
    for i = 1:1:count {
      set oref = ##class(Shop.Product).%OpenId(id(i))
      set item = $extract(oref.Name, 1, $zposition(oref.Name, 20))
      set line = item _ $justify("", 20 - $zwidth(item)) _ " " _ $justify(%session.Data("basket", id(i)), 3)
      // ObjectScriptの配列は1基点 → Javascriptの0基点に合わせて末尾追加
      do orderIds.%Push(id(i))
      do orderLines.%Push(line)
      set total = total + (cust.determinePrice(oref.ListPrice) * %session.Data("basket", id(i)))
    }
    set return.OrderIds   = orderIds
    set return.OrderLines = orderLines
    set return.Total      = $fnumber(total, ",")

    write return.%ToJSON()

  }
  catch e {
    set status = e.AsStatus()
  }

  quit status
}

}

%sessionを使用している場合は、REST APIで書き換えるのは、相当難しいことが判明しました。
(CSPのセッションとRESTのセッションは別物のため)

#callに書き換えるしかなさそうです

Hiroshi Sato · Jun 13, 2023 go to post

Hi, Evgeny

Thanks for your comment.

I have slightly changed the content based on your suggestion.

Hiroshi Sato · Jun 7, 2023 go to post

Hi, Ben

Thank you for your comment.

I have slightly rewritten the content based on your suggestion

Hiroshi Sato · Apr 28, 2023 go to post

Thanks, Iryna
You are right.

Alexey
This is actually a quite old article so that it includes old things
Now we don't need to care about V5.0 thingss at all.

Hiroshi Sato · Mar 23, 2023 go to post

Thanks for pointing that out.
Certainly this method does not give us the answers we are currently expecting.
This article was originally posted in Japan quite some time ago, so it certainly would have worked in past versions.
Anyway, I will try to rewrite this article so that it works as expected in the latest version.