需要实现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)。 我在这个项目的开始。 我已经做了一个项目,我定义的模式,但我还没有提取代码,使一个干净的图书馆。 这将很快完成。