部分アップデート(更新チェックあり)

クライアントから送信されたキーと値のペアと、サーバー上の既存のキーと値のペアをサーバー上でマージして更新する方法です。変更の差分だけをキーと値のペアとしてクライアント側で用意して、サーバーに送信します。なお、サーバー側のキーそのものはこの方法で削除できません。

更新の際、「楽観的ロック(Optimistic lock)」の機能によるチェックを行います。クライアントへの KiiObject の取得以降に、サーバー上で他のクライアントからの更新があった場合は、更新処理がエラー応答します。

更新のコード例を以下に挙げます。

curl -v -X POST \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "If-Match: 2" \
  -H "X-HTTP-Method-Override: PATCH" \
  "https://api-jp.kii.com/api/apps/{APP_ID}/users/me/buckets/{BUCKET_ID}/objects/{OBJECT_ID}" \
  -d '{"score": 5000}'

HTTP ヘッダに "X-HTTP-Method-Override: PATCH" が埋め込まれていると、Kii Cloud は部分アップデートを実施します。

送信の際に "IF-Match" ヘッダを送信すると、サーバー上で他のクライアントからの更新があったかどうかのチェックが行われます。更新チェックを行わず、常に上書きを行う場合は "IF-Match" ヘッダそのものを送信しないようにします。

更新チェックを行う際、"IF-Match" ヘッダで送信する値 {OBJECT_VERSION} は、直前に取得した _version の値です。KiiObject の取得 に示す方法で KiiObject を取得すると、以下のような JSON データを取得できます。このデータの _version 部分を次回の更新処理で送信します(この例では "IF-Match: 3"を送信)。

{"score":5000,"name":"game1","_created":1337039114613,"_id":"d8dc9f29-0fb9-48be-a80c-ec60fddedb54","_modified":1337040183711,"_owner":"ff43674e-b62c-4933-86cc-fd47bb89b398","_dataType":"mydata","_version":"3"}

Kii Cloud では、サーバー側での _version と、送信された "IF-Match" ヘッダの値を比較します。値が異なる場合は他のクライアントからの書き換えを検出したことになるため、HTTP ステータス 409 で応答します。

KiiObject の部分アップデートに成功すると、Kii Cloud は以下の様に作成時間・更新時間(どちらも UNIX 時間、ミリ秒、UTC)をレスポンスを返します。

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< ETag: "3"
< Content-Type: application/vnd.{APP_ID}.mydata+json
< Transfer-Encoding: chunked
< Date: Tue, 15 May 2012 00:03:03 GMT
<
{
  "score":5000,
  "name":"game1",
  "_created":1337039114613,
  "_id":"d8dc9f29-0fb9-48be-a80c-ec60fddedb54",
  "_modified":1337040183711,
  "_owner":"ff43674e-b62c-4933-86cc-fd47bb89b398",
  "_dataType":"mydata",
  "_version":"3"
}

レスポンス中の "score" の値が 5000 に変更されています。