如何最好地设计具有多个过滤器的REST API?

xbo*_*nez 8 mysql api rest

作为个人编程项目,我正在努力抓取我的大学课程目录并将数据作为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
Run Code Online (Sandbox Code Playgroud)

我需要有一个所有排列的URL.对我和API消费者而言,这看起来非常麻烦,而且非常糟糕.

选项2

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

example.com/api/byinstructor/<instructorcode>
example.come/api/bycollege/<collegecode>
Run Code Online (Sandbox Code Playgroud)

如果消费者想要的话bycollegeandinstructor,他会对他进行过滤.

选项3

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

example.com/api/getcourses/<jsonstring>

jsonstring = 
{ 
  instructor:<instructorcode>,
  college:<collegecode>,
  ...and so on
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ete 14

为了扩展JF的答案,听起来你有一个资源,一组课程,它们将在URI:

/courses
Run Code Online (Sandbox Code Playgroud)

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

/courses?college=123&instructor=321
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以避免所有可能的排列问题,从而产生大量资源.

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

  • 从技术上讲,这些仍然是不同的资源.你并没有真正避免这种排列问题; 实际上,通过允许college = 123&instructor = 321返回与讲师= 321&college = 123相同的响应,您可以略微增加这些问题.由于这种爆炸,许多缓存不会缓存具有查询参数的响应,除非您明确配置它们这样做.因此,如果您可以在人们提出的请求中找出一些常见模式,我通常会建议使用选项2. (6认同)

jfs*_*jfs 5

GET example.com/courses?college=<collegecode>&instructor=<instructorcode>
Run Code Online (Sandbox Code Playgroud)