我想在安卓手机上构建一个 REST 客户端。
REST 服务器公开了几个资源,例如(获取)
http://foo.bar/customer List of all customer
http://foo.bar/customer/4711 The customer with id 4711
http://foo.bar/customer/vip List of all VIP customer
http://foo.bar/company List of all companys
http://foo.bar/company/4711 The company with the ID 4711
http://foo.bar/company/vip List of all VIP companys
我(认为)我知道如何与 REST 服务器通信并获取我需要的信息。我会用这样的 API 实现一个 REST 客户端类
public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();
public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();
引用了 Virgil Dobjanschi 的演示文稿“Developing Android REST client applications” 我了解到在 Activity 的工作线程中处理 REST 请求不是一个好主意。相反,我应该使用 Service API。
我喜欢有一个绑定(bind)到(本地)服务的 Singleton ServiceHelper 的想法,但我担心我没有正确理解服务概念。
目前我不明白如何将 REST 调用结果(在服务中异步完成)报告回调用方 Activity。我还想知道我是否需要一个服务来处理所有 REST 请求(具有不同的返回类型),或者我是否需要为每个 REST 请求提供专用服务。
可能我还有许多其他的理解问题,所以对我来说最好的事情是满足我的需求的示例应用程序。我的用例并不少见,我希望那里有示例应用程序。
请告诉我!
任何其他指出我正确实现方向的建议也很有帮助(Android API-Demo 与我的用例不匹配)。
提前致谢。
克劳斯
编辑:在 SO 上找到的类似主题(发布后)将我引向我需要的方向(最小化复杂的“Dobjanschi 模式”):
最佳答案
概览
编辑:
任何有兴趣的人也可以考虑看看 RESTful android这可能会让你更好地了解它。
我从尝试实现 Dobjanschi 模型的经验中学到的是,并非一切都是一成不变的,他只为您概述了如何做这可能会因应用程序而异,但公式是:
遵循这个想法 + 添加你自己的 = 快乐的 Android 应用程序
某些应用程序的模型可能因要求而异,有些应用程序可能不需要 SyncAdapter 的帐户,其他应用程序可能使用 C2DM,我最近工作的这个可能会帮助某人:
创建具有 Account 和 AccountManager 的应用程序
它将允许您使用 SyncAdapter 来同步您的数据。这已在 Create your own SyncAdapter 上讨论过
创建一个 ContentProvider (如果它适合您的需要)
这种抽象允许您不仅可以访问数据库,还可以通过 ServiceHelper 执行 REST 调用,因为它具有与 REST Arch 的一对一映射方法。
内容提供者 | REST 方法
查询 ----------------> 获取
插入 ----------------> 放置
更新 ----------------> 发布
删除 ----------------> 删除
ServiceHelper 分层
这个人基本上会使用您从 ContentProvider 传递的参数启动 (a) 服务,这些服务执行 Http(不一定是协议(protocol),但它是最常见的)REST 方法。我传递了从内容提供程序上的 UriMatcher 获得的匹配整数,所以我知道要访问什么 REST 资源,即
class ServiceHelper{
public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters
}
}
服务
被执行(我大部分时间都使用 IntentService),它使用从助手传递的参数进入 RESTMethod,它有什么用?请记住,服务很适合在后台运行。
还实现一个广播接收器,这样当服务完成它的工作时,通知我的 Activity 注册了这个广播并再次重新查询。我相信这最后一步不在 Virgill Conference 上,但我很确定这是一个不错的选择。
RESTMethod 类
取参数,WS资源(http://myservice.com/service/path)添加参数,准备好一切,执行调用,保存响应。
如果需要 authtoken,您可以向 AccountManager 请求 如果服务调用因为身份验证失败,您可以使 authtoken 失效并重新获得一个新的 token 。
无论我基于匹配器创建处理器并传递响应,RESTMethod 最终都会给我一个 XML 或 JSON。
处理器
它负责解析响应并在本地插入。
示例应用程序?当然!
此外,如果您对测试应用程序感兴趣,请查看 Eli-G ,它可能不是最好的例子,但它遵循 Service REST 方法,它是由 ServiceHelper、Processor、ContentProvider、Loader 和 Broadcast 构建的。
关于java - 需要实现 Virgil Dobjanschi REST 实现模式的示例 Android REST 客户端项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948152/