如果您的服务和 UI 层完全分开,您将获得最大的收益。我的意思是,在设计服务时不要考虑特定的 UI,因为这样做可以最大限度地重用它们。我会推荐一个基于 Web 的 RESTful 服务实现,因为它们为 UI 集成提供了很大的灵活性。现在确实有大量图书馆能够使用来自此类服务的数据。
我不是 Ruby 开发人员,但这是 Sinatra 中的一个简单的 Web 服务实现:
require 'rubygems'
require 'sinatra'
require 'lib/posts'
post '/posts'
post = Post.create! params
redirect "/posts/#{post.id}"
do
get 'posts/:id' do
@post = Post.find(params[:id])
erb :post
end
归因:使用 Sinatra 和 RESTClient 的轻量级 Web 服务。
请注意,用于服务实现的实际语言/平台是无关紧要的,只要它是 RESTful 的,并且返回客户端可以轻松使用的数据。一旦你有了这个设置,那么设计一个 web 应用程序和一个移动应用程序就变成了选择一个合适的集成库的问题:
- HTML(5)/CSS/Javascript。更强大的选项之一,因为它可用于实现移动和 Web 应用程序。上述三项技术构成了新 Web 2.0 架构的核心,并且存在各种框架:Angular.js、Ext.js、Backbone.js、Knockout.js,甚至jQuery Mobile或Bootstrap。这是目前最常用的将 Web 服务 API 与 Web 应用程序集成的方式。请注意,在某些情况下,您甚至可以只设计一个网站,然后将其用作您的移动应用程序的基础(例如,通过 iOS UIWebView/Android WebView)。
- 中间层代理:如果您想在浏览器中取消 Ajax(出于安全目的,或避免 XSS 问题),您将采用这条路线。代理可以用任何语言(Java、PHP、Ruby、Perl)编写,并负责使用您的 Web 服务并为您的 UI 生成动态 HTML。
作为一个真实的例子,我当前的项目有大量使用 Java EE/JAX-RS 构建的 RESTFul Web 服务,这些服务在集群 JBoss 服务器上运行。这些服务默认返回 JSON,但也可以生成 XML,并且可以从以下位置访问:
- 使用 Ext.js 构建的各种内部和外部 Web 应用程序
- 使用 AFNetworking/RestKit/NSURLConnection 组合的 iOS 应用程序
- 使用Jersey REST 客户端的 Android 应用程序
完全相同的服务被多个不同的平台/用户界面使用,服务端不需要更改。这就是我相信你正在努力实现的目标。