RESTful API上搜索资源的缓存控制策略

时间:2010-02-05 11:09:46

标签: rest cache-control

我正在创建一个RESTful API(使用MVC.NET)以允许外部访问业务系统。 API包括搜索资源。资源采用URI形式“/ example / search / pages / 1 /?query = something”。

示例:要搜索披萨,您将访问URI“/ example / search / pages / 1 /?query = pizza”,它将为您提供前10个结果。要获得第二页结果,您需要“/ example / search / pages / 2 /?query = something”等。

我已经使用缓存控制HTTP标头来启用API上所有资源的公共缓存,目的是显着减少服务于API Web应用程序的服务器的负载。

但是我不确定要用于搜索资源的缓存策略。由于资源(及其URI)根据您搜索的内容而有所不同,因此缓存页面似乎没什么意义。人们为RESTful API上的搜索资源推荐什么缓存策略(即通过缓存控制HTTP头缓存)?没有缓存?私有缓存的到期时间非常短?短期到期的公共缓存?

2 个答案:

答案 0 :(得分:10)

大多数代理都不会缓存使用查询字符串的任何内容。

如果你想要缓存,我建议你使用POST-Redirect-GET模式为你的搜索请求制作新的URI。

POST搜索 内容类型:application / x-www-form-urlencoded

术语=东西

303见其他 位置:/ search / something / 1

这将使缓存更加激烈,但您必须制作这些URI并仍然会受到初始POST的影响。也就是说,如果这是有问题的查询,这将很好地解决问题。

答案 1 :(得分:1)

具有适当max-age的公共缓存是您想要的 - max-age的值将是特定于应用程序的,并且是您必须进行的主观判断调用。

你必须平衡提供过时响应的风险和不必计算每个请求的奖励。如果这种风险非常高,那么缩短时间 - 但只要意识到这样做会增加你的负担原始服务器。监控使用模式和服务器负载是个好主意,以确定您的初步判断是否正确。

这不是你问题的一部分,但如果我是你,我会将分页移动到URI的查询部分,所以

/示例/搜索/页/ 1 /查询=东西

会变成:

/示例/搜索术语=东西&安培;页= 1

这不是必需的,但它对开发人员来说更直观,而且您可以使用HTML表单轻松实现