1. ホーム
  2. java

[解決済み] Android REST クライアント、サンプル?

2022-05-15 09:59:02

質問

このスレッドが回答を受け付けている場合でも、他のアイデアを自由に提案することができます。


こんな記事にも出会いました。

そして、REST クライアント アプリケーションに関するこの Google I/O 2010 ビデオにたどり着きました。

これ以降、RESTコンポーネントを静的コンポーネントとしてアプリケーションコントローラクラスに作成するようにしました。

これからは、このパターンを変えていこうと思います。 誰か が指摘した Google IOSched アプリケーションは、Android 上で REST クライアントを書く方法の素晴らしいサンプルであると指摘しています。 他の誰か は、この方法は複雑すぎると言っています。

では、どなたかベストプラクティスを教えていただけませんか?簡潔でシンプルな方法で。

IOSchedアプリケーションは、サンプルのユースケースには複雑すぎます。

どのように解決するのですか?

EDIT 2(2017年10月)です。

2017年ですからね。Retrofitを使えばいいのです。それ以外を使う理由はほぼない。

EDITです。

オリジナルの回答は、この編集の時点で1年半以上前のものです。オリジナルの回答で提示された概念はまだ有効ですが、他の回答が指摘するように、現在ではこのタスクを簡単にするライブラリが存在します。さらに重要なのは、これらのライブラリの中には、デバイスの設定変更を処理してくれるものがあるということです。

オリジナルの回答は、参考のために以下に残してあります。しかし、Android用のRestクライアント ライブラリのいくつかを調べ、あなたの使用事例に合うかどうかを確認する時間も取ってください。以下は、私が評価したいくつかのライブラリのリストです。決して網羅的なリストであることを意図しているわけではありません。


オリジナルの回答です。

AndroidでRESTクライアントを持つための私のアプローチを紹介します。私はそれがベストであると主張しませんが:) また、これは私の要件に応えて思いついたものであることに注意してください。あなたのユースケースが必要とするならば、より多くのレイヤーを持ち、より複雑さを追加する必要があるかもしれません。たとえば、私のアプリはいくつかの REST 応答の損失を許容できるため、ローカル ストレージをまったく持っていません。

私のアプローチでは、単に AsyncTask を使います。私の場合は、これらのタスクを Activity インスタンスから呼び出していますが、画面の回転などのケースを完全に考慮するために Service などから呼び出すこともできます。

私は意識的にRESTクライアントそのものをAPIとすることにしました。これは、私のRESTクライアントを使用するアプリは、実際のREST URLと使用されるデータ形式を認識する必要さえないことを意味します。

クライアントは2つのレイヤーを持つことになります。

  1. トップレイヤー。このレイヤーの目的は、REST APIの機能を反映したメソッドを提供することです。例えば、REST APIのすべてのURLに対応する1つのJavaメソッドを持つことができます(あるいは、GET用とPOST用の2つを持つこともできます)。

    これはRESTクライアントAPIへのエントリポイントです。これは、アプリが通常使用する層です。シングルトンである可能性もありますが、必ずしもそうではありません。

    REST呼び出しの応答は、このレイヤーによってPOJOにパースされ、アプリに返されます。

  2. これは、低レベルの AsyncTask 層で、HTTP クライアントメソッドを使用して、実際に REST 呼び出しを行います。

の結果を伝えるために、コールバック機構を使うことにしました。 AsyncTask の結果をアプリに伝えるために、コールバック機構を使うことにしました。

テキストはもう十分です。では、コードを見てみましょう。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(または他のフォーマット)を直接使用しないことに注意してください。その代わりに、アプリが見るのは、ビーン 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
            }
        });

このコメントでデザインを説明するのに十分だと思いますが、もっと情報を提供していただけると嬉しいです。