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
ディスカッション (0)0