2012-01-10 64 views
7

作为一个个人编程项目,我正在努力挖掘我的大学课程目录并将数据作为REST API提供。我已经成功地将所有数据都存入数据库,并且现在正在处理API。教练,大学,学分,时间,日期等如何最好地使用多个过滤器设计REST API?

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

课程可以在许多标准的基础上进行过滤?

选项1

提供大量的网址,如

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 
} 

我想,而不是JSON字符串,我也需要POST数组,但是这对于消费者来说似乎不具有原始性,因为他正在获取数据。

或者还有另一种方法做到这一点我不知道?如果第三个选项是最佳选项,那么您能否提供一个简短的总结,以便根据可能具有可变数目值的JSOn字符串来准备SQL查询?

回答

13

为了从JF答案扩大,这听起来像你有一个资源,集课程,这将是在URI:

/courses 

过滤该资源通常使用查询完成参数来筛选单个资源,如:

/courses?college=123&instructor=321 

通过这样做,你回避的问题与所有可能的排列创建资源的增殖。

基本上:有一个资源,可根据需要进行过滤。

+0

Thanls。在我读到你的回答之前,我没有考虑资源方面的问题 – xbonez 2012-01-10 17:02:34

+6

从技术上讲,这些仍然是不同的资源。你并不真正用这种方式来避免排列问题。事实上,通过允许college = 123&instructor = 321返回与instructor = 321&college = 123相同的响应,您可以稍微增加这些问题。由于这种爆炸,许多缓存不会缓存具有查询参数的响应,除非您明确地配置它们。 因此,如果您可以确定人们提出的请求中的一些常见模式,我通常会推荐选项2。 – fumanchu 2012-01-11 15:51:30

+0

@fumanchu关于缓存忽略对具有查询参数的请求的响应很有趣,我没有意识到这一点。谢谢。 – Pete 2012-01-11 19:33:34

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

和消费者被允许通过尽可能多或尽可能少的GET参数,因为他们想要? – xbonez 2012-01-10 16:43:06

+0

@xbonez:是的。在没有约束的情况下,您可以使用适用于您的应用程序的默认值,例如,如果用户已知,则进行个性化过滤。 – jfs 2012-01-10 16:56:28

+0

完美。谢谢 – xbonez 2012-01-10 17:02:10