为什么在WebAPI PUT参数中包含记录键

时间:2016-10-05 07:47:38

标签: rest asp.net-web-api

在我看到的用于实现{ "_id" : ObjectId("57b3aa2db630347c1f9308b4"), "updated" : ISODate("2016-08-30T05:05:18.301Z"), "created" : ISODate("2016-08-17T00:05:01.354Z"), "createdTimeStamp" : 1471392301, "likes" : [], "comments" : [ { "created" : 1471935213, "user" : ObjectId("57b33c810a56a0a81a9b50b7"), "text" : "next party", "_id" : ObjectId("57bbf2edee7a923c156c2f08") }, { "created" : 1471935612, "user" : ObjectId("57b33c810a56a0a81a9b50b7"), "text" : "its new party ", "_id" : ObjectId("57bbf47cddd701302ba14fca") }, { "created" : 1471935717, "user" : ObjectId("57b33c810a56a0a81a9b50b7"), "text" : "its new again", "_id" : ObjectId("57bbf4e5f934024c275f4f08") }, ], "total_comments" : 3, "consumer_id" : ObjectId("57b33c810a56a0a81a9b50b7") // Original User that receive notification } 方法的所有 ASP.NET WebAPI 示例中,记录的密钥作为单独的参数传递给模型更新。例如:

HTTP PUT

我很好奇为什么使用这种方法而不是定义模型上的键值并简化调用?

[HttpPut]
public HttpResponseMessage Put(int id, UserEditViewModel model)
{
    // Look up existing record
    User user = await db.Users.FindAsync(id);
    // Apply changes
    // user.Name = model.Name;
    // Commit updated record to data store
    db.SaveChanges();
}

在大多数情况下,我认为View无论如何都需要public HttpResponseMessage Put(UserEditViewModel model) { // Look up existing record User user = await db.Users.FindAsync(model.UserId); // Apply changes // user.Name = model.Name; // Commit updated record to data store db.SaveChanges(); } ,所以我不知道如何/为什么它会从View的角度来复杂化模型,但是我我相信一定有充分的理由。

1 个答案:

答案 0 :(得分:1)

根据我们所讨论的RESTful的级别,我认为它可能更多是关于便利性。查看How do I capture all of my compiler's output to a file?,工作流程可能是这样的:

GET /api/users/{id}

一旦客户端导航到用户,服务器将构建链接uri,用唯一的资源标识符填充它,所以它看起来像这样:

"api:user-edit": {
  "href": "http://apiname:port/api/user/{id}"
},

所以客户端必须要做一个

PUT /api/users/{id}

使用适当的有效负载(理论上应该是完整的资源,但通常服务器只选择查看几个字段 - 几乎像PATCH)。