繁体   English   中英

RESTful API的效率

[英]Efficiency of RESTful APIs

我当前正在创建一个应用程序(例如,Notes应用程序-Web应用程序+移动应用程序)。 我想在这里使用RESTful API,所以我阅读了很多有关此主题的内容,发现那里存在很多歧义。

因此,让我们从头开始。 REST的开始是我们必须首先请求/(根),然后它返回可以进一步检索的路径列表,等等,等等。这不是REST完全浪费的第一部分吗? 代替固定的路径,我们每次想做某事时都必须获取它们。 罗。

我遇到的第二个问题是批量操作 如何在REST中实现它们? 假设用户暂时无法访问互联网,进行了一些更改,并且都必须在服务器上进行。 假设用户修改了50个便笺,添加了30个便笺,然后删除了20个便笺。我们现在必须发出100个单独的请求 进行批量操作的方法将非常有用-我看到了这个stackoverflow主题: 在REST Web服务中处理批处理操作的模式? 但实际上我没有发现任何有趣的东西。 只要您想对一种资源进行一种操作就可以了。

最后但并非最不重要的-检索整个项目集合。 在写一个我提到的示例应用程序(便笺应用程序)时,您可能想一次检索所有项目集合(便笺,标签,可用的便笺颜色等)。 使用REST,您必须首先检索项目链接列表,然后一个个地获取项目。 100笔记=超过100个请求。

由于我目前正在学习所有这些REST知识,所以我在这里所说的可能完全错了。 无论如何,我读得越多,对我来说看起来就越可怕。 所以最后我的问题是:我在哪里错和/或如何解决我提到的问题?

这都是关于资源的 通过统一接口(通常通过URI和HTTP方法)获得的资源。

  1. 不必通过根每次进行导航。 一个好的接口可以使它们的URI 永远存活(如果过时,则应返回HTTP Moved或类似的消息)。 Root Fieldings定义的REST架构元素之一是HATEOAS的一部分, 提供根目录的导航路径。
  2. 批量操作是一种架构风格不强的东西。 基本上没有什么阻止你POST包含多个项目的特定资源的有效载荷。 同样,这完全取决于您使用/提供的资源,最终取决于服务器实现如何处理请求。 您的100个请求的案例:我可能会坚持100个请求。 编写起来很干净,开销也不是那么大。
  3. 检索集合:这是API决定提供的资源 GET bookCollection/ vs GET book/1GET/book/2 ...甚至GET book/all 或者也许是GET book/?includeDetails=true来返回所有与GET一一对应的细节相同的书。

我认为此链接可以为您设计RESTful服务提供有趣的提示: https : //templth.wordpress.com/2014/12/15/designing-a-web-api/

也就是说,这是我对您的问题的回答:

  • 无需为根路径实现资源。 因此,我认为您是指HATEOS。 另外,还不需要有效载荷内的链接。 否则,您可以使用Swagger或RAML等可用格式来记录RESTful服务。 这向您的最终用户显示可用的内容。

  • 关于批量操作,您可以自由使用POSTPATCH方法在列表资源上实施此操作。 我认为这两个答案可能对您有所帮助:

  • 实际上,您可以随意考虑方法GET所需的内容。 这意味着由资源(列表资源和元素资源)管理的根元素可以包含其提示以及依赖项。 因此,您可以在返回的内容中包含多个级别。 例如,您可以为元素Book引用这样的内容,该元素引用Author的列表:

     GET /books { "title": "the title", (...) "authors": [ { "firstName": "first name", "lastName": last name" }, { (...) }, (...) ] } 

    您会注意到,您可以利用查询参数来要求RESTful服务恢复期望的水平。 例如,如果您只想要书的提示或与相应作者的书的提示:

     GET /books { "title": "the title", (...) } GET /books?include=authors { "title": "the title", (...) "authors": [ { "firstName": "first name", "lastName": last name" }, { (...) }, (...) ] } 

    您会注意到,您可以在此处区分两个概念:

    • 内部数据 (复杂类型,内部对象):特定于元素并嵌入元素本身的数据
    • 引用数据 :引用并对应其他元素的数据。 在这种情况下,您可以在根元素中嵌入一个链接或数据本身。

    OData规范通过其功能“导航链接”及其查询参数expand解决此类问题。 有关更多详细信息,请参见以下链接:

希望对您有帮助,蒂埃里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM