草庐IT

java - 需要实现 Virgil Dobjanschi REST 实现模式的示例 Android REST 客户端项目

coder 2023-04-27 原文

我想在安卓手机上构建一个 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/

有关java - 需要实现 Virgil Dobjanschi REST 实现模式的示例 Android REST 客户端项目的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  6. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

随机推荐