編集2(2017年10月):
それは2017年です。レトロフィットを使用してください。他のものを使用する理由はほとんどありません。
編集:
元の回答は、この編集時点で1年半以上前のものです。元の回答で提示された概念はまだ保持されていますが、他の回答が指摘するように、このタスクをより簡単にするライブラリが現在そこにあります。さらに重要なことに、これらのライブラリのいくつかはデバイス構成の変更を処理します。
元の回答は参照用に以下に保持されています。ただし、Android向けのRestクライアントライブラリをいくつか調べて、それらがユースケースに適合するかどうかを確認してください。以下は、私が評価したいくつかのライブラリのリストです。網羅的なリストを意図したものではありません。
元の回答:
AndroidでRESTクライアントを使用する私のアプローチを紹介します。私はそれが最高だとは主張していません:)また、これは私の要件に応えて私が思いついたものです。ユースケースで必要な場合は、レイヤーを追加するか、複雑さを追加する必要があります。たとえば、ローカルストレージはまったくありません。私のアプリはいくつかのREST応答の損失を許容できるためです。
私のアプローチでは、単にAsyncTask
sを使用しています。私の場合、Activity
インスタンスからこれらのタスクを「呼び出し」ます。しかし、画面の回転などのケースを完全に説明するには、Service
それらをなどから呼び出すことを選択できます。
私は意識的に自分のRESTクライアント自体をAPIとして選択しました。つまり、RESTクライアントを使用するアプリは、実際のREST URLと使用されているデータ形式を認識する必要さえありません。
クライアントには2つのレイヤーがあります。
トップ層:この層の目的は、REST APIの機能を反映するメソッドを提供することです。たとえば、REST APIのすべてのURLに対応するJavaメソッドを1つ持つことができます(GET用とPOST用の2つ)。
これは、RESTクライアントAPIへのエントリポイントです。これは、アプリが通常使用するレイヤーです。シングルトンの場合もありますが、必ずしもそうとは限りません。
REST呼び出しの応答は、このレイヤーによってPOJOに解析され、アプリに返されます。
これは、AsyncTask
HTTPクライアントメソッドを使用して実際に出て、そのREST呼び出しを行う下位レベルのレイヤーです。
さらに、AsyncTask
sの結果をアプリに返すためにコールバックメカニズムを使用することを選択しました。
十分なテキスト。今いくつかのコードを見てみましょう。架空のREST API URLを取得しましょう-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);
}
アプリが(Activity
またはでService
)APIを使用する方法は次のとおりです。
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
}
});
コメントがデザインを説明するのに十分であることを願っています。しかし、私はより多くの情報を提供してうれしいです。