我似乎无法在网上找到有关在Rails中构建REST API的不同方法的更多信息;所以我有两个问题:
当用户将.xml
添加到结尾时,使用标准控制器返回XML
网址
优点:
缺点:
.xml
会在不适用的地方发挥作用
使用命名空间路由创建仅处理API的单独API控制器 功能,但仍然可以访问网站使用的相同模型
优点:
缺点:
使用路由转发和约束将所有API调用转发到Rack 应用
优点:
缺点:
答案 0 :(得分:17)
我建议API与您的网站在同一个项目中并不是坏事,只要代码是DRY *。就像你指出的那样,拥有单独的代码库是一个挑战,因为你必须让它们与你所做的每个功能/ bug修复同步。如果它们在同一个地方,它们更容易维护。只要你保持你的代码DRY,这种方法就是明显的赢家。
我会从控制器提供XML和JSON,其子域由Rails的路由引擎处理。当有人接受了api.site.com/resource.xml的模式并尝试访问不存在的资源时,这真的不是什么大问题。只要您的API被清楚地记录下来并且当他们尝试访问不在您的API中的资源时您会失败/错误,那么它应该没问题。我会尝试返回一条消息,说明资源不可用,以及您的api文档的URL。对于任何API使用者而言,这不应该是运行时问题,因为这应该是发现API的一部分。
只需我0.02美元。
* DRY =不要重复自己。 DRY代码意味着您不会为您的网站和api复制粘贴或重写相同的内容;你从多个地方提取和打电话。
答案 1 :(得分:3)
我认为最适合您的解决方案是合并您的前两点。
我建议使用JSON而不是XML:支持XML的唯一一点是XPath,它在返回的数据中是无用的。 JSON可以提供更好的响应时间(以及更可读的数据,以便更好地进行调试!:p)。此外,大多数语言都可以读取JSON。例如,PHP可以使用json_decode
本地解析JSON到数组/对象,所以这是一个很好的观点。 ;)
对于控制器,你可以命名它,但它不是一个义务,也许在某些情况下更好地避免大量条件下的胖动作。使用Rails 3路由器,子域(api.webapp.com)中API调用的分离是微不足道的。
对于模型,请确保使用与整个应用程序中使用的相同的内容。
新的rails路由器语法是糖,你会喜欢。祝你好运玩得开心! :)