RESTful API的效率

时间:2015-02-28 10:28:17

标签: api rest web-applications

我目前正在创建一个应用程序(例如,应用笔记应用程序,例如webapplication + mobile app)。我想在这里使用RESTful API,所以我读了很多关于这个主题的内容,我发现那里有很多含糊不清的内容。

所以让我们从头开始吧。 REST的开头是我们必须首先请求/(root),然后它返回我们可以进一步检索的路径列表等等。难道这不是REST完全浪费的第一部分吗?我们必须在每次想要做某事时获得它们,而不是僵硬的路径。全息

我遇到的第二个问题是批量操作。如何在REST中实现它们?假设用户暂时无法访问互联网,进行了一些更改,所有这些都必须在服务器上进行。所以,假设用户修改了50个音符,添加了30个音符并删除了20.我们现在必须进行 100个单独的请求。进行批量操作的方法非常有用 - 我看到了这个stackoverflow主题:Patterns for handling batch operations in REST web services?但我实际上并没有发现任何有趣的内容。只要您想在一种资源上进行一种操作,一切都会好的。

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

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

2 个答案:

答案 0 :(得分:2)

关于资源的全部内容。通过统一接口获得的资源(通常通过URI和HTTP方法)。

  1. 每次都必须在root中导航。一个好的接口可以让他们的URI保持活动永远(如果他们变得陈旧,他们应该返回HTTP Moved或类似的)。根提供导航的路径是HATEOAS的一部分,Roy Fieldings之一定义了REST的架构元素。
  2. 批量操作是建筑风格不强的事情。基本上没有什么能阻止你将POST包含多个项目的有效负载停止到特定资源。同样,它取决于您使用/提供的资源以及最终服务器实现如何处理请求。您的100个请求的情况:我可能会坚持100个请求。写得很干净,开销也不大。
  3. 检索集合:它涉及资源 API决定提供的内容。 GET bookCollection/ vs GET book/1GET/book/2 ...甚至GET book/all。或者也许GET book/?includeDetails=true可以将所有与GET相同的详细信息的书逐一归还。

答案 1 :(得分:0)

我认为此链接可以为您提供设计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。有关详细信息,请参阅以下链接:

希望它可以帮到你, 亨利