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

时间:2012-01-10 16:36:17

标签: mysql api rest

作为个人编程项目,我正在努力抓取我的大学课程目录并将数据作为REST API提供。我已成功删除所有数据并将其存储在数据库中,现在正在使用API​​。

课程可以根据许多标准进行过滤:教师,大学,学分,时间,日等。

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

选项1

提供多个网址,例如

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

我需要一个包含所有排列的网址。对我和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查询?

2 个答案:

答案 0 :(得分:13)

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

/courses

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

/courses?college=123&instructor=321

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

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

答案 1 :(得分:5)

GET example.com/courses?college=<collegecode>&instructor=<instructorcode>