2

基本的に、私のアプリに必要なのは、Azure Mobile Service での挿入操作で、作成したばかりのアイテムの ID を受け取ることができるようにすることです。サーバー側では、次のようなことができることを知っています

function insert(item, user, request)
{
  request.execute({
    function success() {
      request.respond(200, item.id);
    }
  });
}

これにはいくつか問題があります。まず、作成したアイテムの ID のみを追加したい場合、デフォルトの応答を完全にオーバーライドしています。次に、クライアント側では、MobileServiceClient.InsertAsync を呼び出したときに応答の本文にアクセスする方法がわかりました。

問題は、読み取りなどの操作で応答を変更するのはかなり簡単ですが、応答に項目 ID を含めるのはかなり難しいようです。これを達成する方法についてのアイデアはありますか?

問題をさらに調べると、返されたオブジェクトなどのデータがとにかく応答に既に含まれていることが示唆されます。IDを取得するにはどうすればよいですか?

4

1 に答える 1

4

サーバー側では、何もする必要はありません。挿入されるアイテムは、id フィールドなしでサーバーに送られ、id フィールドが返されます。たとえば、これはデータをテーブルに挿入するために送信される典型的なリクエストです。

POST /tables/people HTTP/1.1
Content-Type: application/json
Content-Length: ...
Host: myservice.azure-mobile.net

{"name":"John Doe","age":33}

そして、これはその応答です:

HTTP/1.1 201 Created
Content-Type: application/json
Date: ...
Content-Length: ...

{"name":"John Doe","age":33,"id":234}

クライアント側では、リクエストが完了した後に id にアクセスできます。マネージ言語を使用している場合は、次のようになります。

var item = new Person { Name = "John Doe", Age = 33 };
await table.InsertAsync(item);
// When the call returns, the Id field is populated with the id from the server
var newId = item.Id;

または JavaScript で:

var item = { name: 'John Doe', age: 33 };
table.insert(item).done(function(inserted) {
    var id = inserted.id;
});

またはObjective-Cで:

NSDictionary *item = @{@"name":@"John Doe",@"age":@33};
[table insert:item completion:^(NSDictionary *inserted, NSError *insertError) {
    NSNumber *id = [inserted objectForKey:@"id"];
}];
于 2013-07-30T15:04:31.667 に答える