投稿者

Developer Support Engineer at InterSystems Japan
記事 Megumi Kakechi · 2 hr 前 3m read

RESTでストリーム(stream)のパラメータを受け取る方法

これは InterSystems FAQ サイトの記事です。
通常、フォームデータを受け取りたい場合は、CSPと同様に %request.Get() で受け取れます。

URLパラメータで、?name=123 のようにリクエストする場合も、同様に%request.Get(“name”) で受け取れます。
 

ファイルの場合は、%request.MimeDataで取得できます

例:

  set fname=%request.MimeData("files",1).FileName
  set upload=%request.MimeData("files",1)

  set save=##class(%Stream.FileBinary).%New()
  set save.Filename="C:\work\in\"_fname
  do save.CopyFromAndSave(upload)


HTMLやPostmanなどで、通常のテキストデータをフォームデータとして送る場合も、%request.Get() で受け取れます。

例:

set name=%request.Get("name") 


ただ同じフォームデータを送る場合でも、例えばPowerShellで以下のように Invoke-RestMethod コマンドを利用して、ファイルを含む Form データをを送る場合、"txt" や "name" など一緒に送るパラメータもStreamデータとして送られます。

Invoke-RestMethod -Uri "http://localhost/iris/csp/user/rest2/start/" `
    -Method Get `
    -Form @{
        "txt" = "code sample"
        "name" = "InterSystems"
        "files" = Get-Item "C:\temp\a3.csv"
    }


その場合は、以下のように取得できます。

例:

set nameStream = %request.GetMimeData("name")
set vname = nameStream.Read()


以下に、IRIS側で定義したRESTのクラスのサンプルをご紹介します。

Class User.REST2 Extends %CSP.REST
{

Parameter CHARSET = "UTF-8";

Parameter HandleCorsRequest = 1;

XData UrlMap
{
<Routes>
	<Route Url="/start/" Method="GET" Call="start" />
</Routes>
}

/// API開始
ClassMethod start() As %Status
{
    // フォームパラメータを出力する
	write !,"-------------------------"
    if %request.GetMimeData("txt")="" {
        set v1=%request.Get("txt") 
        write !,"v1 = ",$G(v1)
    } else {
    	set nameStream = %request.GetMimeData("txt")
        write !,"v1s = ",nameStream.Read()_"   ; Stream"
    }
 
     if %request.GetMimeData("name")="" {
        set v2=%request.Get("name") 
        write !,"v2 = ",$G(v2)
    } else {
    	set nameStream = %request.GetMimeData("name")
        write !,"v2s = ",$ZCVT(nameStream.Read(),"I","UTF8")_"   ; Stream"
    }
	write !,"-------------------------",!    

   // ファイルアップロード:サーバの C:\work\in\ フォルダ内に保存
   set fname=%request.MimeData("files",1).FileName
   set upload=%request.MimeData("files",1)
   set save=##class(%Stream.FileBinary).%New()
   set save.Filename="C:\work\in\"_fname
   set st= save.CopyFromAndSave(upload)
      
   if st {
     write !,fname_" アップロード完了!!"
   } else {
     write !,fname_" アップロード失敗"
   }
    
    write !,"end"
    quit $$$OK
}

}


PowerShell(バージョン:7.5.3 使用)で実行すると、以下のように返ります。
ファイルはサーバの C:¥work¥in 下に保存されます

PS C:\Users\Administrator> Invoke-RestMethod -Uri "http://localhost/iris/csp/user/rest2/start/" `
>>     -Method Get `
>>     -Form @{
>>         "txt" = "code sample Japan!"
>>         "name" = "インターシステムズ"
>>         "files" = Get-Item "C:\temp\a3.csv"
>>     }
-------------------------
v1s = code sample Japan!        ; Stream
v2s = インターシステムズ        ; Stream
-------------------------

a3.csv アップロード完了!!
end
PS C:\Users\Administrator>


PostmanでREST実行(GETリクエスト)する場合は以下のようになります。

  
【ご参考】

*REST/JSON の簡単なサンプルご紹介
https://jp.community.intersystems.com/node/496376

*IRIS/REST APIを呼び出す簡単なサンプル
https://jp.community.intersystems.com/node/562926