【问题标题】:How best to design a REST API with multiple filters?如何最好地设计具有多个过滤器的 REST API?
【发布时间】:2017-07-14 23:52:27
【问题描述】:

作为个人编程项目,我正在收集我大学的课程目录并将数据作为 REST API 提供。我已成功抓取所有数据并将其存储在数据库中,现在正在开发 API。

可以根据许多标准过滤课程:讲师、学院、学分、时间、日期等。

在这种情况下提供 API 的最佳方式是什么?

选项 1

提供大量 URL,例如

example.com/api/byinstructor/<instructorcode>
example.come/api/bycollege/<collegecode>
example.com/api/bycollegeandinstructor/<collegecode>/<instructorcode>
...and so on

我需要一个用于所有排列的 URL。对于我和 API 消费者来说,这似乎很麻烦,而且非常不干燥。

选项 2

仅提供主要选项的 API,例如:

example.com/api/byinstructor/<instructorcode>
example.come/api/bycollege/<collegecode>

如果消费者想要bycollegeandinstructor,他会自己进行过滤。

选项 3

用户将 JSON 字符串传递给我,我使用它来获取过滤条件

example.com/api/getcourses/<jsonstring>

jsonstring = 
{ 
  instructor:<instructorcode>,
  college:<collegecode>,
  ...and so on
}

我想我可能还需要一个 POST 数组,而不是 Json 字符串,但这对于消费者来说似乎不直观,因为他正在获取数据。

或者还有其他我不知道的方法吗?如果第三个选项是最佳选项,您能否提供一个简短的摘要,以最好地根据可能具有可变数量值的 JSOn 字符串准备 SQL 查询?

【问题讨论】:

    标签: mysql api rest


    【解决方案1】:

    为了扩展 J.F. 的答案,听起来你有一个资源,即一组课程,它位于 URI:

    /courses
    

    过滤该资源通常使用查询参数来过滤该单个资源,例如:

    /courses?college=123&instructor=321
    

    通过这样做,您可以避免所有可能的排列造成资源扩散的问题。

    从根本上说:只有一种资源,可以根据需要进行过滤。

    【讨论】:

    • 谢谢。在阅读 yhour 答案之前,我并没有考虑资源方面的问题
    • 从技术上讲,这些仍然是不同的资源。这样你并不能真正避免排列问题。事实上,通过允许college=123&instructor=321 返回与instructor=321&college=123 相同的响应,您会稍微增加这些问题。由于这种爆炸式增长,许多缓存不会缓存具有查询参数的响应,除非您明确配置它们这样做。出于这个原因,如果您可以在人们提出的请求中找出一些常见的模式,我通常会推荐选项 2。
    • @fumanchu 缓存忽略对带有查询参数的请求的响应很有趣,我不知道这一点。谢谢。
    【解决方案2】:
    GET example.com/courses?college=<collegecode>&instructor=<instructorcode>
    

    【讨论】:

    • 允许消费者传递任意多或少的GET参数?
    • @xbonez:是的。在没有约束的情况下,您可以使用适合您的应用程序的默认值,例如,如果用户已知,则个性化过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2017-11-16
    • 2017-06-17
    • 2011-04-26
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多