RESTAPI如何处理不完整答案

RESTAPI如何处理不完整答案,rest,Rest,我目前正在开发一个带有MongoDB后端的RESTAPI,由于具有访问权限,客户端可能会在某些数据可以访问而另一些数据被禁止的情况下查找数据 例如,假设我希望在单个请求中包含来自数据库的对象a、B和X,但我没有足够的权限访问对象X 我想让我的API回答对象X的A、B和禁止状态。是否有任何最佳实践可以做到这一点?结果请求的状态代码是什么?当用户试图使用其URI检索单个资源的表示,但用户没有足够的权限访问此类资源时,服务器将返回。或者,如果服务器想要隐藏该资源的存在 另一方面,在用户获取资源集合的表

我目前正在开发一个带有MongoDB后端的RESTAPI,由于具有访问权限,客户端可能会在某些数据可以访问而另一些数据被禁止的情况下查找数据

例如,假设我希望在单个请求中包含来自数据库的对象a、B和X,但我没有足够的权限访问对象X


我想让我的API回答对象X的A、B和禁止状态。是否有任何最佳实践可以做到这一点?结果请求的状态代码是什么?

当用户试图使用其URI检索单个资源的表示,但用户没有足够的权限访问此类资源时,服务器将返回。或者,如果服务器想要隐藏该资源的存在

另一方面,在用户获取资源集合的表示形式并且由于(例如)缺乏权限而不能返回所有可用资源的场景中,服务器应仅返回用户有权访问的资源的表示形式


如果要限制对资源字段的访问,可以为它们设置不同的URI,然后相应地验证权限

考虑以下示例:

  • /orders/{id}
    :给定订单的摘要
  • /orders/{id}/items
    :给定订单的项目
  • /orders/{id}/payment
    :给定订单的付款详细信息
  • /orders/{id}/invoice
    :给定订单的发票详细信息
  • /orders/{id}/delivery
    :给定订单的交货详细信息
您可以为每个子资源使用信封,并为每个子资源添加状态

假设您的API返回一个主资源a,而主资源a又包含两个子资源B和X。如果调用者没有访问a的权限,那么API应该清楚地用HTTP/403响应,正如cassiomolin正确指出的那样

如果调用方拥有对所有资源的完全权限,则示例响应将是(假设JSON负载):

{
“实体信封a”:{
“状态”:“确定”,
“数据”:{
“财产1”:“价值1”,
“财产2”:“价值2”
}
},
“实体信封Β”:{
“状态”:“确定”,
“数据”:{
“财产1”:“价值1”,
“财产Β2”:“价值2”
}
},
“实体信封Χ”:{
“状态”:“确定”,
“数据”:{
“财产Χ1”:“价值1”,
“财产Χ2”:“价值2”
}
}
}
如果调用方无权访问子资源X,则响应为:

{
“实体信封a”:{
“状态”:“确定”,
“数据”:{
“财产1”:“价值1”,
“财产2”:“价值2”
}
},
“实体信封Β”:{
“状态”:“确定”,
“数据”:{
“财产1”:“价值1”,
“财产Β2”:“价值2”
}
},
“实体信封Χ”:{
“状态”:“禁止”,
“数据”:{}
}
}

如果API文档中记录了这种方法,那么调用者可以在解析
数据
字段之前检查信封的
状态
字段。

如果您有一个包含3个资源的列表,其中1个是调用者无法访问的,您将如何处理上面提到的场景OP?您是否仍然显示它,但在其详细信息页面上给出403?或者只显示2个结果?@Ludo21South在API调用方获取资源集合的表示形式,并且由于(例如)缺乏权限而无法返回所有可用资源的情况下,服务器应仅返回用户有权访问的资源的表示形式。@Ludo21South“还是只显示两个结果?”这就是解决方法。@cassiomolin感谢您提供了这个详细的答案,那么我想客户端我需要查看返回的资源,与我要求的内容进行比较,并显示“禁止”“对于那些没有被服务器返回的用户?@Jerome嗯,这实际上取决于您的需要以及您希望为用户提供的体验。考虑你在亚马逊上搜索一些东西。它将返回与您的搜索条件匹配的所有产品。与搜索条件不匹配的产品不会显示在搜索结果中。感谢您的回答,尽管如此,我还是有点担心这种方法会增加我的服务器有效负载,因为我需要交换一些数据…我的方法有一个(明显的)优点:您可以有一个端点(和一个请求响应)根据调用者权限使用多功能负载。另一方面,它绝对不是纯粹的REST(正如@cassiomolin所建议的,子资源应该映射到不同的URI),并且正如您所指出的,您的有效负载将更胖。