用于REST服务的HTTP谓词和内容协商或GET字符串?

时间:2009-03-30 01:38:49

标签: http rest

我正在设计REST服务,并试图权衡使用完整的http谓词和内容协商与GET字符串变量的优缺点。我的选择会影响可缓存性吗?这两种解决方案都不适用于每个领域。

哪个最适合crud和查询(例如?action = PUT)?

最适合api版本选择(例如?version = 1.0)?

最适合返回数据类型(例如?type = json)?

1 个答案:

答案 0 :(得分:5)

CRUD /查询最好用HTTP谓词表示。创建和更新通常是PUT或POST。检索将是GET。删除将是DELETE。这是一般的映射。重点是GET不会引起副作用,并且动词会做你期望他们做的事。

将动作放在URI中是正常的,如果这是传递它的方式(例如,http客户端库不允许您发送非GET / POST请求)。但是,大多数库,所以强烈建议通过URL传递动词。

版本API的“最佳”方式是在每个请求的基础上使用HTTP标头;这使客户端可以升级/降级特定请求,而不是每个请求。当然,版本控制的粒度需要在开始时进行烘焙,并且可能使服务器端代码严重复杂化。大多数人只是使用访问服务器的URL。更长的解释是blog post by Peter Williams, "Versioning Rest Web Services"

没有最佳的返回数据类型;这取决于你的应用程序。对于Ajax网站来说,JSON可能更容易,而对于想要使用Xpath查询的复杂结构,XML可能更容易。协议缓冲区是第三种选择。它还讨论了最好是在URL或HTTP头中最好地指定返回协议。

在大多数情况下,标题对缓存的影响最大,因为代理在被告知时应该尊重它们,用户代理也是如此(显然UA的行为不同)。仅基于URL的缓存非常依赖于层。某些用户代理不会使用查询字符串(Safari,iirc)缓存任何内容,并且代理可以根据需要自由缓存或不缓存。