Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该使用哪种资源来保持API的RESTFul?_Api_Rest_Asp.net Web Api_Restful Url_Restful Architecture - Fatal编程技术网

我应该使用哪种资源来保持API的RESTFul?

我应该使用哪种资源来保持API的RESTFul?,api,rest,asp.net-web-api,restful-url,restful-architecture,Api,Rest,Asp.net Web Api,Restful Url,Restful Architecture,我正在构建一个API,允许API的客户端发送通知,提醒用户更新订单状态。到目前为止,有两个通知: 当用户未将订单标记为已收到时 当用户未将订单标记为已完成时 我想构建这个API,使其能够简单地扩展到与订单相关的其他通知,但为这个API的客户端保留一个简单的URI。 如何定义资源以保持API的RESTFul 我在考虑建立一个这样的结构: 备选案文1: 选项2(从资源中省略状态并将其发布): 编辑 选项2.1(按照@Jazimov的建议,保留一个链接URI): 哪种选择更合适?一种选择比另一种有

我正在构建一个API,允许API的客户端发送通知,提醒用户更新订单状态。到目前为止,有两个通知:

  • 当用户未将订单标记为已收到时
  • 当用户未将订单标记为已完成时
我想构建这个API,使其能够简单地扩展到与订单相关的其他通知,但为这个API的客户端保留一个简单的URI。 如何定义资源以保持API的RESTFul

我在考虑建立一个这样的结构:

备选案文1:

选项2(从资源中省略状态并将其发布):

编辑

选项2.1(按照@Jazimov的建议,保留一个链接URI):


哪种选择更合适?一种选择比另一种有什么优势吗?或者还有其他我没有想到的选项吗?

我认为,要更新已插入记录的状态,应该放置端点而不是POST

你可以用

PUT: /api/ordernotification/:id/status/
使用json数据的客户端

 {
     "status": "your_status"
 }

根据请求数据,端点应该更新记录。

如果我理解正确,您有两种类型的
订单通知
:用于通知
接收的通知
和用于通知
完成的通知
。如果这是两个独立的数据模型,那么我认为嵌套它们是一个好主意(即一个名为
ReceiveOrderNotification
CompleteOrderNotification
的表)。如果是这种情况,那么您可能希望完全公开两个不同的端点,例如
POST/api/receiveordernotification
POST/api/completeordernotification

但我不认为这是你能做的最好的,因为订单通知之间可能有很多重叠的相似之处。现在,选项2更像是一个
GET
,因为您使用的是查询参数,所以使用第一个选项,让我们将它们折叠为:

POST: /api/ordernotification/
然后向其传递一些JSON数据以创建通知

{
    "orderId": "orderId",
    "userId": "userId",
    "prompt": "not marked received/not marked done"
}
我还删除了
/{id}
,因为当你
POST
你创建了一个全新的东西,而id通常还没有被创建。即使客户机正在创建一个
id
并将其发送给API,保持它处于打开状态也是一种好的做法,这样您的API就可以以自己的方式创建一个新的、唯一的资源


这是RESTful的,因为
POST
使用某些数据点创建资源
ordernotification
。您的第一个选项使操作本身成为一种资源,但这可能不会在后端的任何数据模型中表示。为了尽可能实现RESTful,API端点应该表示数据库域(表、集合等)。然后,根据请求中发送的数据,让控制器选择要使用的服务方法。否则,REST端点会提前暴露所有逻辑,并成为一长串无法维护的端点。

我会按照这些思路来做

POST /api/order/1234/notifications/not-received
POST /api/order/1234/notifications/not-completed
稍后可通过

GET /api/order/1234/notifications/not-received
GET /api/order/1234/notifications/not-completed


URI在语义上的丰富程度没有真正的限制,因此您最好利用这一点并显式使用。

您可以使用:/api/ordernotification/{statusID}/{id}。这是RESTful的,因为您使用的是一个链接式URI,很明显您使用的是ordernotification函数——让路由从这里开始。您还可以灵活地添加您认为合适的状态。可能选项3:
PATCH/api/order/{id}
with
{status:“received”}
。()@Kenney我想如果我想更新订单的状态,补丁会很有用。在我的示例中,我只想发送一个通知,告诉用户这样做。资源“顺序”将保持不变。啊,我明白了。对不起,我误解了!这些通知是否会导致电子邮件的发送?如果它们只是出现在网站的仪表板上,我会采取不同的方法。@Kenney不必担心。是的,现在它会导致发送电子邮件,我们可能会在不久的将来使用Signal。我不想更新订单状态。此API用于通知负责执行该操作的用户。因此,在本例中,资源将是订单通知,而不是订单本身。好的,那么我认为您的第二个选项更好。在指定请求中的状态时,我看到的唯一问题是API的客户端需要知道要发送的状态,因此,当他们可能只想发送1个状态的通知(比如完成)时,我必须公开我的OrderStatus API。IMHO说,POST/api/completeordernotification将更简单、更有意义。
{
    "orderId": "orderId",
    "userId": "userId",
    "prompt": "not marked received/not marked done"
}
POST /api/order/1234/notifications/not-received
POST /api/order/1234/notifications/not-completed
GET /api/order/1234/notifications/not-received
GET /api/order/1234/notifications/not-completed
GET /api/order/1234/notification/8899