Android REST客户端,示例?

即使这个线程已经接受了答案,随意提出其他的想法,你使用或喜欢


我见过这些文章:

  • Restful API服务
  • 适用于Android的Java REST客户端API

这就让我看到了这个关于REST客户端应用程序的Google I / O 2010video

  • http://www.youtube.com/watch?v=xHXn3Kg2IQE&feature=player_embedded

从现在起,我一直在我的Application控制器类中创buildREST组件作为静态组件。

从现在开始,我认为,我应该改变模式。 有人指出, Google IOSched应用程序是如何在Android上编写REST客户端的绝佳示例。 有人说这种方式太复杂了。

那么,有谁可以告诉我们最好的做法是什么? 简而言之,
对于示例用例,IOSched应​​用程序太复杂了。

编辑2(2017年10月):

这是2017年,只需使用改造。 几乎没有理由使用其他任何东西。

编辑:

原来的答案在编辑时已经超过一年半了。 尽pipe在原始答案中提出的概念仍然存在,正如其他答案所指出的那样,现在有些图书馆使得这个任务更容易。 更重要的是,这些库中的一些库会为您处理设备configuration更改。

下面保留原始答案以供参考。 但是,请花些时间来检查Android的某些Rest客户端库,以查看它们是否适合您的用例。 以下是我评估的一些库的列表。 这决不是一个详尽的清单。

  • Volley (来自Google)
  • RESTDroid
  • RoboSpice
  • 改造

原始答案:

介绍我在Android上使用REST客户端的方法。 我不认为这是最好的虽然:)另外,请注意,这是我想出了回应我的要求。 如果您的用例需要,您可能需要更多层/增加更多的复杂性。 例如,我根本没有本地存储; 因为我的应用程序可以容忍一些REST响应的丢失。

我的方法只使用AsyncTask的封面。 在我的情况下,我从我的Activity实例“调用”这些任务; 但要充分考虑像屏幕旋转这样的情况,你可以select从Service或其他方面调用它们。

我有意识地select了我的REST客户端本身作为一个API。 这意味着,使用我的REST客户端的应用程序甚至不需要知道实际的REST URL和使用的数据格式。

客户端将有2层:

  1. 顶层:该层的目的是提供镜像REST APIfunction的方法。 例如,您可以在REST API中为每一个URL分配一个Java方法(甚至两个GET方法和一个POST方法)。
    这是进入REST客户端API的入口点。 这是应用程序正常使用的图层。 这可能是一个单身人士,但不一定。
    REST调用的响应被这个层parsing成一个POJO并返回给应用程序。

  2. 这是较低级别的AsyncTask层,它使用HTTP客户端方法实际发送并进行REST调用。

另外,我select使用callback机制将AsyncTask的结果传递回应用程序。

足够的文字。 现在让我们看一些代码。 让我们假设一个REST APIurl – http://myhypotheticalapi.com/user/profile

顶层可能看起来像这样:

  /** * Entry point into the API. */ public class HypotheticalApi{ public static HypotheticalApi getInstance(){ //Choose an appropriate creation strategy. } /** * Request a User Profile from the REST server. * @param userName The user name for which the profile is to be requested. * @param callback Callback to execute when the profile is available. */ public void getUserProfile(String userName, final GetResponseCallback callback){ String restUrl = Utils.constructRestUrlForProfile(userName); new GetTask(restUrl, new RestTaskCallback (){ @Override public void onTaskComplete(String response){ Profile profile = Utils.parseResponseAsProfile(response); callback.onDataReceived(profile); } }).execute(); } /** * Submit a user profile to the server. * @param profile The profile to submit * @param callback The callback to execute when submission status is available. */ public void postUserProfile(Profile profile, final PostCallback callback){ String restUrl = Utils.constructRestUrlForProfile(profile); String requestBody = Utils.serializeProfileAsString(profile); new PostTask(restUrl, requestBody, new RestTaskCallback(){ public void onTaskComplete(String response){ callback.onPostSuccess(); } }).execute(); } } /** * Class definition for a callback to be invoked when the response data for the * GET call is available. */ public abstract class GetResponseCallback{ /** * Called when the response data for the REST call is ready. <br/> * This method is guaranteed to execute on the UI thread. * * @param profile The {@code Profile} that was received from the server. */ abstract void onDataReceived(Profile profile); /* * Additional methods like onPreGet() or onFailure() can be added with default implementations. * This is why this has been made and abstract class rather than Interface. */ } /** * * Class definition for a callback to be invoked when the response for the data * submission is available. * */ public abstract class PostCallback{ /** * Called when a POST success response is received. <br/> * This method is guaranteed to execute on the UI thread. */ public abstract void onPostSuccess(); } 

请注意,应用程序不直接使用REST API返回的JSON或XML(或任何其他格式)。 相反,应用程序只能看到这个bean Profile

然后,下层(AsyncTask层)可能看起来像这样:

 /** * An AsyncTask implementation for performing GETs on the Hypothetical REST APIs. */ public class GetTask extends AsyncTask<String, String, String>{ private String mRestUrl; private RestTaskCallback mCallback; /** * Creates a new instance of GetTask with the specified URL and callback. * * @param restUrl The URL for the REST API. * @param callback The callback to be invoked when the HTTP request * completes. * */ public GetTask(String restUrl, RestTaskCallback callback){ this.mRestUrl = restUrl; this.mCallback = callback; } @Override protected String doInBackground(String... params) { String response = null; //Use HTTP Client APIs to make the call. //Return the HTTP Response body here. return response; } @Override protected void onPostExecute(String result) { mCallback.onTaskComplete(result); super.onPostExecute(result); } } /** * An AsyncTask implementation for performing POSTs on the Hypothetical REST APIs. */ public class PostTask extends AsyncTask<String, String, String>{ private String mRestUrl; private RestTaskCallback mCallback; private String mRequestBody; /** * Creates a new instance of PostTask with the specified URL, callback, and * request body. * * @param restUrl The URL for the REST API. * @param callback The callback to be invoked when the HTTP request * completes. * @param requestBody The body of the POST request. * */ public PostTask(String restUrl, String requestBody, RestTaskCallback callback){ this.mRestUrl = restUrl; this.mRequestBody = requestBody; this.mCallback = callback; } @Override protected String doInBackground(String... arg0) { //Use HTTP client API's to do the POST //Return response. } @Override protected void onPostExecute(String result) { mCallback.onTaskComplete(result); super.onPostExecute(result); } } /** * Class definition for a callback to be invoked when the HTTP request * representing the REST API Call completes. */ public abstract class RestTaskCallback{ /** * Called when the HTTP request completes. * * @param result The result of the HTTP request. */ public abstract void onTaskComplete(String result); } 

以下是应用程序如何使用API​​(在“ Activity或“ Service ):

 HypotheticalApi myApi = HypotheticalApi.getInstance(); myApi.getUserProfile("techie.curious", new GetResponseCallback() { @Override void onDataReceived(Profile profile) { //Use the profile to display it on screen, etc. } }); Profile newProfile = new Profile(); myApi.postUserProfile(newProfile, new PostCallback() { @Override public void onPostSuccess() { //Display Success } }); 

我希望这些意见足以解释这个devise。 但我很乐意提供更多的信息。

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

我知道的唯一的参考实现(如果你知道更多的话请注释)可以在Datadroid上find (Google IO会话在/ presentation下面提到)。 这是一个你可以在自己的应用程序中使用的库。

第二个链接要求“最佳”REST框架,这在stackoverflow上进行了大量的讨论。 对我来说,应用程序的大小是重要的,其次是执行的性能。

  • 通常,我使用简单的org.json实现,这是API自1级以来的一部分,因此不会增加应用程序的大小。
  • 对我来说非常有意思的是在JSONparsing器上发现的信息性能 :在Android 3.0 Honeycomb中,GSON的streamparsing器被包含在android.util.JsonReader中。 不幸的是,评论不再可用。
  • Spring的Android(我有时使用)支持Jackson和GSON。 Spring的Android RestTemplate模块文档指向一个示例应用程序 。

因此我坚持使用org.json或GSON来实现更复杂的场景。 对于org.json实现的体系结构,我使用一个代表服务器用例的静态类(例如findPerson,getPerson)。 我从一个服务调用这个function,并使用实现映射(项目特定)和networkingIO(我自己的REST模板,用于纯GET或POST)的工具类。 我尽量避免使用reflection。

永远不要使用AsynTask来执行networking请求或任何需要被保留的东西。 asynchronous任务与您的活动紧密相关,如果用户在创build应用程序后更改屏幕方向,则AsyncTask将会停止。

我build议你在Intent Service和ResultReceiver中使用Service模式。 看看RESTDroid 。 它是一个库,允许您asynchronous执行任何types的REST请求,并通过实现Virgil Dobjanschi服务模式的请求侦听器来通知您的UI。

还有另一个更清洁的API和types安全的数据库。 https://github.com/kodart/Httpzoid

这是一个简单的使用示例

 Http http = HttpFactory.create(context); http.post("http://example.com/users") .data(new User("John")) .execute(); 

或者更复杂的callback

 Http http = HttpFactory.create(context); http.post("http://example.com/users") .data(new User("John")) .handler(new ResponseHandler<Void>() { @Override public void success(Void ignore, HttpResponse response) { } @Override public void error(String message, HttpResponse response) { } @Override public void failure(NetworkError error) { } @Override public void complete() { } }).execute(); 

这是新鲜的,但看起来很有希望。

有很多的图书馆,我使用这个: https : //github.com/nerde/rest-resource 。 这是我创build的,正如你在文档中看到的,它比其他的更干净简单。 它不是专注于Android,但我使用它,它工作得很好。

它支持HTTP基本身份validation。 它执行序列化和反序列化JSON对象的肮脏的工作。 你会喜欢它,特别是如果你的API是Rails的。

免责声明:我参与了rest2mobile开源项目

作为REST客户端的另一种select是使用rest2mobile 。

该方法稍有不同,因为它使用具体的rest示例来生成REST服务的客户端代码。 代码用本地Java方法和POJOreplace了REST URL和JSON有效载荷。 它还自动处理服务器连接,asynchronous调用和POJO到/从JSON转换。

请注意,这个工具有不同的风格(cli,plugins,android / ios / js支持),您可以使用android studio插件直接将API生成到您的应用程序中。

所有的代码可以在这里findgithub 。