作为一个个人编程项目,我正在努力挖掘我的大学课程目录并将数据作为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查询?
Thanls。在我读到你的回答之前,我没有考虑资源方面的问题 – xbonez 2012-01-10 17:02:34
从技术上讲,这些仍然是不同的资源。你并不真正用这种方式来避免排列问题。事实上,通过允许college = 123&instructor = 321返回与instructor = 321&college = 123相同的响应,您可以稍微增加这些问题。由于这种爆炸,许多缓存不会缓存具有查询参数的响应,除非您明确地配置它们。 因此,如果您可以确定人们提出的请求中的一些常见模式,我通常会推荐选项2。 – fumanchu 2012-01-11 15:51:30
@fumanchu关于缓存忽略对具有查询参数的请求的响应很有趣,我没有意识到这一点。谢谢。 – Pete 2012-01-11 19:33:34