我正在设计一个REST服务,并试图权衡使用完整数组的http动词和内容协商与GET字符串变量的优缺点.我的选择会影响可缓存性吗?这两种解决方案都不适用于每个领域.
哪个最适合crud和查询(例如?action = PUT)?
哪个最适合api版本选择(例如?version = 1.0)?
哪种返回数据类型最好(例如?type = json)?
CRUD /查询最好用HTTP动词表示.创建和更新通常是PUT或POST.检索将是GET.删除将是DELETE.这是一般的映射.重点是GET不会引起副作用,并且动词会按照您的期望来做.
将操作放在URI中是正常的,如果这是传递它的方式(例如,http客户端库不允许您发送非GET/POST请求).但是,大多数库都这样做,因此强烈建议不要通过URL传递动词.
对API进行版本化的"最佳"方法是在每个请求的基础上使用HTTP标头; 这使客户端可以升级/降级特定请求,而不是每个请求.当然,版本控制的粒度需要在开始时进行烘焙,并且可能使服务器端代码严重复杂化.大多数人只是使用访问服务器的URL.更长的解释是在Peter Williams的博客文章中,"Versioning Rest Web Services"
没有最佳的返回数据类型; 这取决于你的应用程序.对于Ajax网站来说,JSON可能更容易,而对于想要使用Xpath查询的复杂结构,XML可能更容易.协议缓冲区是第三种选择.它还讨论了最好是在URL或HTTP头中最好地指定返回协议.
在大多数情况下,标题对缓存的影响最大,因为代理在被告知时应该尊重它们,用户代理也是如此(显然UA的行为不同).仅基于URL的缓存非常依赖于层.某些用户代理不会使用查询字符串(Safari,iirc)缓存任何内容,并且代理可以根据需要自由缓存或不缓存.