需要实现Virgil Dobjanschi REST实现模式的示例Android REST Client项目

我想在Android手机上构build一个REST客户端。

REST服务器公开了几个资源,例如(GET)

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的演示文稿“ 开发Android REST客户端应用程序 ”,我了解到,在Activity的Worker线程中处理REST请求并不是一个好主意。 相反,我应该使用服务 API。

我喜欢有一个绑定到(本地)服务的Singleton ServiceHelper的想法,但是我担心我不了解服务概念是正确的。

现在我不明白如何将REST调用结果(在Service中asynchronous完成)回报给调用者Activity。 我也想知道是否需要一个处理所有REST请求(具有不同的返回types)的服务,或者是否需要为每个REST请求提供一个专用的服务。

也许我还有很多其他的理解问题,所以对我来说最好的东西就是一个满足我需求的示例应用程序 。 我的用例并不奇怪,我希望在那里有示例应用程序。

请你让我知道!

任何其他的build议,指出我在正确的实施方向也是有帮助的(Android API演示不符合我的用例)。

提前致谢。

克劳斯

编辑 :类似的主题发现SO(发布后),这导致我在我需要的方向(最小化复杂的“Dobjanschi模式”):

  • Android:宁静的API服务

概观

编辑:

任何兴趣也可以考虑看RESTful Android这可能会给你一个更好的看看。

我从试图实施Dobjanschi模型的经验中学到的东西,并不是所有的东西都是石头书写的,他只给你一个从应用程序到应用程序的变化的概述,但是公式是:

遵循这个想法+添加您自己的=愉快的Android应用程序

在某些应用程序上的模型可能会有所不同,有些可能不需要SyncAdapter的帐户,其他可能使用C2DM,最近我工作的这个可能会帮助某人:


创build一个具有Account和AccountManager的应用程序

它将允许您使用SyncAdapter同步您的数据。 这已经在创build您自己的SyncAdapter中进行了讨论

创build一个ContentProvider (如果它适合您的需求)

这个抽象使您不仅可以访问数据库,还可以访问ServiceHelper来执行REST调用,因为它与REST Arch具有一对一的映射方法。

内容提供者| REST方法

查询—————-> GET

插入—————-> PUT

更新—————-> POST

删除—————->删除

ServiceHelper分层

这个人将基本上启动(a)使用从ContentProvider传递的参数来执行Http(不一定是协议,但是它是最常见的)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,这有什么好处? 记得服务很好,在后台运行的东西。

同时实现一个BroadCastReceiver,所以当服务完成的工作通知我的活动注册这个广播和再次查询。 我相信这最后一步不是在维尔吉尔会议上,但我相当确定是一个好的方法。

RESTMethod类

取参数,WS资源( http://myservice.com/service/path )添加参数,准备好所有内容,执行调用并保存响应。

如果需要authtoken,您可以从AccountManager请求如果服务的调用因为身份validation失败,则可以使authtoken和reauth无效以获得新的令牌。

最后RESTMethod给我一个XML或JSON,无论我创build一个基于匹配器的处理器,并传递响应。

处理器

它负责parsing响应并在本地插入。

示例应用程序? 当然!

另外,如果您对testing应用程序感兴趣,那么您可以看看Eli-G ,它可能不是最好的示例,但它遵循Service REST方法,它是使用ServiceHelper,Processor,ContentProvider,Loader和Broadcast构build的。

Android编程有一个完整的章节(13.Exploring Content Providers),专门讨论Virgil的Google I / O对话中的“选项B:使用ContentProvider API”。

我们并不是唯一看到这种方法的好处的人。 在2010年5月的Google I / O会议上,Google的Virgil Dobjanschi发表了一个演讲,概述了使用内容提供者将RESTful Web服务集成到Android应用程序中的以下三种模式。

在本章中,我们将用我们的第二个Finchvideo示例详细探讨第二个模式; 这个策略将为您的应用程序带来许多重要的好处。 由于这种方法将networking操作集成到Android MVC中的优雅,我们给它一个名字“networkingMVC”。

未来版本的Android编程可能会解决其他两种方法,并logging此Google演示文稿的更多详细信息。 读完本章之后,我们build议您查看Google的话题。

强烈推荐。

由Zigurd Mednieks,Laird Dornin,G. Blake Meike和Masumi Nakamura编程的Android。 Copyright 2011 O'Reilly Media,Inc.,978-1-449-38969-7。

由Virgil Dobjanschi撰写的“开发Android REST客户端应用程序”引发了许多讨论,因为在会议期间没有提供源代码,或者之后提供了源代码。

  • 参考实现可在http://datadroid.foxykeep.com下find(Google IO会话在/ presentation下面提到)。 这是一个你可以在自己的应用程序中使用的库。
  • Android优先级Job Queue的灵感来自Dobjanschi的演讲,听起来对我很有希望。

请评论,如果你知道更多的实现。

我们已经开发了一个图书馆来解决这个问题: RoboSpice 。

图书馆使用Virgil Dobjanschi和Neil Goodmann描述的“服务方法”,但我们提供了一个完整的一体化解决scheme:

  • asynchronous执行(在后台AndroidService中)将返回POJO的networking请求(例如:REST请求)
  • caching结果(以Json或Xml或平面文本文件或二进制文件forms)
  • 通知你的活动(或任何其他情况下)的networking请求的结果,如果他们仍然活着
  • 如果他们不活着,不会通知你的活动
  • 在UI线程上通知您的活动
  • 使用简单但强大的exception处理模型
  • 支持多个ContentServices来聚合不同的Web服务结果
  • 支持请求执行的multithreading
  • 是强types的!
  • 是开源的;)
  • 并经过testing

我们实际上是在寻找来自社区的反馈。

改造可能会非常有帮助,它从一个非常简单的configuration为您构build一个适配器,如:

改造将您的REST API转换为Java界面。

 public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); } 

RestAdapter类生成GitHubService接口的实现。

 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); 

GitHubService service = restAdapter.create(GitHubService.class); 生成的GitHubService上的每个调用都会向远程Web服务器发出HTTP请求。

 List<Repo> repos = service.listRepos("octocat"); 

欲了解更多信息,请访问官方网站: http : //square.github.io/retrofit/

注意 :从Retrofit获得的适配器RestAdapter不是从BaseAdapter派生的,你应该为它创build一个包装器这个问题为什么我的ListView在ListFragment中调用setListAdapter之后是空的?

这有点迟了,但是这里有一篇文章解释了谈话的第一个模式:

http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p

关于第一种模式,我喜欢的是其余方法的接口是一个普通类,内容提供者仅仅提供对数据库的访问。

对于初学者,您应该查看Google官方I / O 2010应用程序的源代码,特别是SyncService和io子包中的各个类。

好消息人。 服务助手的实现可以在这里find: https : //github.com/MathiasSeguy-Android2EE/MythicServiceHelper这是一个开源项目(Apache 2)。 我在这个项目的开始。 我已经做了一个项目,我定义的模式,但我还没有提取代码,使一个干净的图书馆。 这将很快完成。