【问题标题】:What is the correct RESTful implementation in WebAPI2?WebAPI2 中正确的 RESTful 实现是什么?
【发布时间】:2016-08-31 21:53:31
【问题描述】:

基本上我发现了关于这个话题的大量意见,但没有一个能说服我什么是正确的。更具体地说,我有以下问题:

单数或复数或两者兼有

  • 还有正确和错误的方式吗?

    标准和惯例的存在是有原因的,我不相信我会满足于 - 这只是品味问题。没有任何指导方针或标准吗?没有权限完成菲尔丁的工作?

要返回什么 IHttpActionResults?它们应该包含什么?

  • 获取 - 返回 Ok();
  • 后 - 返回 Created();
  • Put - 返回(Put?OK?)
  • 删除 - 返回(已删除?好的?)

在 Created(location) 中返回什么?

假设Controller路由是'api/v1/model',应该是

我问这些问题是因为我经常在如何最好地实现 API 方面遇到冲突。

【问题讨论】:

  • +1 这是个好问题。您能否详细说明当您说“假设控制器路由是'api/v1/model',应该是”..etc 控制器路由从域(www.mywebapi.com/)开始时的意思,所以有什么区别在选项 nr 2 和 nr 3 之间?
  • Created()方法中的location参数应该是对当前item的引用吧?我认为 2 和 3 之间的区别应该很明显。 #2 将假定 API 使用者本身将提供 URL 的正确部分,而 #3 - 将返回整个和完整的 URL。 location 参数只是一个普通字符串,据我所知,没有 ".NET-auto-complete-route-to-url-conversion-thingie" 发生。
  • 好的,现在我明白了。当您阅读问题时,“Created(location)”行代表自己。您应该删除换行符或重写它们。不过,这是个好问题,如果 api 是从不同的域使用的,那么我会返回完整的 URL。

标签: c# .net rest asp.net-web-api


【解决方案1】:

问: 单数或复数或两者兼有

切勿同时使用两者。使用任何一个。使用名词而不是动词。

不要使用动词:

/getAllCars
/createNewCar
/deleteAllRedCars

不要混淆单数和复数名词。保持简单,所有资源只使用复数名词。

/cars instead of /car
/users instead of /user
/products instead of /product

现在,如果您在下面看到,它会更有意义:

GET /tickets - 检索门票列表
GET /tickets/12 - 检索特定票
POST /tickets - 创建一个新票
PUT /tickets/12 - 更新票证 #12
PATCH /tickets/12 - 部分更新票证 #12
DELETE /tickets/12 - 删除票 #12

如果一个资源与另一个资源相关,则使用子资源。

GET /cars/711/drivers/ 返回汽车 711 的司机列表

问: 在 Created(location) 中返回什么?

200 OK - 响应成功的 GET、PUT、PATCH 或 DELETE。也可用于不会导致创建的 POST。

201 Created - 对导致创建的 POST 的响应。应与指向新资源位置的Location header 结合使用

澄清你的最后一个问题,我会相应地更新我的答案。

REST 没有明确的标准,每个人都根据自己的需要使用最佳实践。不过,我建议您查看来自 apigee.com 的 PDF,其中列出了 REST API 的最佳实践以及 Facebook、Twitter 等各大公司使用的方法。

【讨论】:

  • location 应该是绝对 url 还是左侧部分 uri?客户期望location 是什么?
  • 另一个问题是并不总是清楚关系(因此路由应该如何工作),考虑多对多关系......其中api/accounts/{id}/user可能是一种选择,但也可能是@ 987654327@ 将语义引导我们进入一个无限循环,这将是合适的api/accounts/{id}/user/accounts/{id}/user/accounts/{id}[..]
  • 如果您在我的帖子中引用 Location Header 链接,它会显示绝对 URI。
  • 为什么会有无限循环?
  • 因为一个account属于一个user,而一个useraccounts,是多对多的关系,这使得不清楚哪种方法是正确的; accounts/{id}/userusers/{id}/accounts.
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 2010-10-05
  • 2011-11-06
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多