Fiwareを使って都市OSを動かしてみよう

Munu


データ仕様の現状と課題
スマートシティの標準規格(案)
データモデルのユースケース
ツール


Column
Link
用語集

Coppell

Technologies

 5. NGSI v2のAPI 5.7-5.73節




5.7.更新処理と格納処理

5.7.1.Entityの格納
2022年4月11日
 これは既に何度も実行しています。例えば、以下のcurlコマンドを使いました。

curl -iX POST --header "Content-Type: application/json" -d @d:\postStore001.json "http://localhost:1026/v2/entities"

この様にentitiesというエンドポイントに対し、POSTというhttp動詞を発行することにより、entityの格納が行われました。この時、データをjson形式で渡しますので、約束事としてjsonでやり取りする事を宣言します。それが"--header "Content-Type: application/json"です。これは、本書の範囲内であれば、特に断らない限り常にこの指定だと理解して頂いて問題ありません。



5.7.2.Attrrinuteの追加・更新
2022年4月11日
 既に存在するentityに対するAttributeの追加も既に勉強しました。例えば、以下です。

curl -iX POST -H "Content-Type: application/json" -d @d:\postrefOffStreetParking002.json http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002/attrs

今度のエンドポイントは"attrs"でした。因みに、"-H"と"--header"は同じ意味です。データとして指定するjson文字列は以下の形式です。

{
   <Attribute名>:{          "name", "location"など
       <ValueのType>:       "Text", "Relationship"など
       <Value>              "ABC", trueなど
   }
}

この指定を既に存在するAttributeに実行すると、Attributeの値が更新されます。また、カンマで区切って、複数のAttributeを指定することも可能です。
 http動詞にPUTを使用して、Attributeのvalueをエンドポイントに、Valueだけを直接更新することも可能です。

curl -X PUT -H 'Content-Type: text/plain' -d 13 http://localhost:1026/v2/entities/urn:ngsi-ld:Refrigerator:002-001/attrs/temperature/value
PS C:\Users\owner> curl -X PUT -H 'Content-Type: text/plain' -d 13 http://localhost:1026/v2/entities/urn:ngsi-ld:Refrigerator:002-001/attrs/temperature/value
PS C:\Users\owner>

この場合、headerの指定が"text/plain"になっていることに留意が必要です。
 ただし、この方法では一つのAttributeしか更新できません。複数のAttributeを更新する場合は、エンドポイントを2つ上の"attrs"にしておいて、http動詞はPATCHを使います。PUTとの違いは、PUTの場合は追加にも更新にも使えましたが、PATCHは更新にしか使えません。例えば以下のようになります。

curl -iX PATCH -H "Content-Type: application/json" -d @d:\postrefOffStreetParking002.json http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002/attrs


5.7.3.バッチ処理
2022年4月11日
 複数のEntityに対し一括して処理(格納や更新)する事をバッチ処理と言います。バッチ処理は"v2/op/update"のエンドポイントに対して行います。幾つかのオプションはjsonの文字列の中に記述します。記述方法は以下となります。

{
   "actionType": <下記オプションのValue>,
   "entities":[ {一件目}, {二件目}, ・・・ ]
}

Key Value 説明
"actionType" "append" POST処理において、既にデータがあれば書き換え、無ければ格納します。
"append_strict" 既にデータが無い場合にだけ実行されます。つまり、すべて格納処理となります
"update" 更新の指定です
"replace" 更新の指定です。updateとの違いは調査中。。。。www
"delete" 削除の指定です。

既にappendやappend_strictの例は使用しました。次はupdateの例をご紹介します。まずは、3件のRefrigeratorの温度を書き換えてみましょう。まずはjsonのテキストを以下の通り作ります。

{
   "actionType": "update",
   "entities": [
       {
           "id": "urn:ngsi-ld:Refrigerator:002-001",
           "type": "Refrigerator",
           "temperature": {
               "type": "Integer",
               "value": -10
           }
       },
       {
           "id": "urn:ngsi-ld:Refrigerator:002-002",
           "type": "Refrigerator",
           "temperature": {
               "type": "Integer",
               "value": -11
           }
       },
       {
           "id": "urn:ngsi-ld:Refrigerator:002-003",
           "type": "Refrigerator",
           "temperature": {
               "type": "Integer",
               "value": -12
           }
       }
   ]
}

このjsonをPOSTに食わせます。

curl -X POST  -H 'Content-Type: application/json' -d @d:\updateRefrigerator002.json 'http://localhost:1026/v2/op/update'

実行後に読み出してみましょう。
PS C:\Users\owner> curl -X POST  -H 'Content-Type: application/json' -d @d:\updateRefrigerator002.json 'http://localhost:1026/v2/op/update'
PS C:\Users\owner> curl -X GET 'http://localhost:1026/v2/entities?type=Refrigerator&options=keyValues'
[{"id":"urn:ngsi-ld:Refrigerator:002-001","type":"Refrigerator","description":"店内で一番窓側に設置した冷蔵庫","name":" 窓側","refStore":"urn:ngsi-ld:Store:002","temperature":-10},{"id":"urn:ngsi-ld:Refrigerator:002-002","type":"Refrigerator","description":"店内で中央の冷蔵庫","name":"中央","refStore":"urn:ngsi-ld:Store:002","temperature":-11},{"id":"urn:ngsi-ld:Refrigerator:002-003","type":"Refrigerator","description":"店内で一番奥に設置した冷蔵庫","name":"奥側","refStore":"urn:ngsi-ld:Store:002","temperature":-12}]
PS C:\Users\owner>

3件とも更新されていますね。
因みに、"actionType": "update"の代わりに"actionType": "replace"を指定しても同じ結果が得られる様です。