これは InterSystems FAQ サイトの記事です。
POST要求で受信したBodyのJSON文字列を、REST ディスパッチクラス内メソッドでダイナミックオブジェクト(%DyamicObject)に変換する際、以下エラーが発生する場合があります。
{
"errors": [
{
"code": 5035,
"domain": "%ObjectErrors",
"error": "エラー #5035: 一般例外 名前 'Premature end of data' コード '12' データ ''",
"id": "GeneralException",
"params": [
"Premature end of data",
12,
""
]
}
],
"summary": "エラー #5035: 一般例外 名前 'Premature end of data' コード '12' データ ''"
}
JSONJSON
POST要求時に送付するBodyの中身は、RESTディスパッチクラスの中では %request.Content を使用して操作でき、%request.Content.Read()とした場合、JSON文字列が取り出せます。
%request.Content.Read()の結果(=POST要求で受信したBodyの長さ)が32KBを超える場合、Read()メソッドは先頭32KBまでしか読み取らない制限があるため、すべてのJSON文字列が渡らずに上記エラーが発生します。
メモ:変数%requestは%CSP.Requestクラスのインスタンス
JSON文字からダイナミックオブジェクトに変換する際使用する%FromJSON()メソッドの引数には、JSON文字列かJSON文字列が含まれるストリームを指定することができます。
Read()メソッドは先頭32KBまでしか読み取らない制限があるので、以下の例のようにRead()の結果を渡すのではなく
set bodyjson={}.%FromJSON(%request.Content.Read())
ObjectScriptObjectScript
JSON文字を含むストリームを%FromJSON()に渡す以下例の方法を使用することで、32KBを超えるJSON文字列が含まれていたとしても、エラーなくダイナミックオブジェクトに変換できます。
set bodyjson={}.%FromJSON(%request.Content)
ObjectScriptObjectScript