Android RESTクライアント、サンプル?

このスレッドが回答を受け入れても、他のアイデアを提案したり、使用したり、好きなように


私はこれらの記事に会った:

それがRESTクライアントアプリケーションに関するGoogle I/O 2010のビデオにつながります

これからは、アプリケーションコントローラクラスに静的コンポーネントとしてRESTコンポーネントを作成しています。

今から、私はパターンを変えなければならないと思います。 誰かは、 Google IOSアプリケーションは、AndroidでRESTクライアントを作成する方法の優れたサンプルです。 誰かがこの方法はあまりにも複雑すぎると語っています。

だから誰もベストプラクティスを教えてください。短く簡単な方法です。
IOSchedアプリケーションは、サンプルユースケースでは複雑すぎます。

108
私はYouTubeのコメンテーターがより良い選択肢を持っているとは思わない。私たちは、AndroidのAPIの中で、非常に複雑すぎて複雑なナンセンスであっても、そのAPIの中で作業しなければなりません。
追加された 著者 Timmmm,
補足として、Android用のオープンソースのEclipseプラグインであるMechanoidは、単純なDSLを使用してJSON-RESTクライアントを生成することができます。その使い方のガイドはこちら 追加された 著者 Ian Warwick,
こんにちは、一般的に私は "ws"という名前のWebサービスのための別のパッケージを開発し、私は "WebServicUtils.java"という名前のクラスを一般化しました。 WebServiceUtils.javaクラスには、Webサービスにアクセスするためのメソッドがあります。私のテクニックが最善かどうかはわかりませんが、Androidアプリケーションでwsパッケージをコピーするたびに再利用できます。私の技術についてもっと知りたい場合は教えてください。
追加された 著者 Ketan Parmar,
これはAndroid RESTクライアントの実装を学ぶ人々にとって非常に役立つかもしれません。 DobjanschiのプレゼンテーションはPDF形式で次のように書き換えられました: drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c /…
追加された 著者 Kay Zed,

6 答え

編集2(2017年10月):

それは2017です。ただRetrofitを使用してください。他のものを使う理由はほとんどありません。

編集:

元の回答は、この編集の時点で1年半以上経過しています。他の答えが指摘しているように、元の答えに表示されている概念はまだ成り立っていますが、現在、このタスクを簡単にするライブラリがあります。さらに重要なことに、これらのライブラリの中には、デバイス構成の変更を処理するものがあります。

元の回答は参考のため以下に保持されています。しかし、あなたのユースケースに合っているかどうかを確かめるために、Androidのためのいくつかの残りのクライアントライブラリを調べる時間を取ってください。以下は、私が評価したライブラリのリストです。それは決して網羅的なリストではありません。


元の回答:

AndroidでRESTクライアントを使用する方法を紹介します。私はそれが最高だと主張していない:)また、これは私の要求に応じて思いついたものであることに注意してください。あなたのユースケースで必要な場合は、レイヤーを増やしたり、複雑さを増やしたりする必要があります。たとえば、私はローカルストレージをまったく持っていません。私のアプリはいくつかのRESTレスポンスの消失を許容することができるからです。

私のアプローチでは、 AsyncTask だけを使っています。私の場合、私は自分の Activity インスタンスからこれらのTaskを呼び出す。画面の回転などの場合を完全に考慮するには、 Service などから呼び出すことを選択できます。

私は意識的にRESTクライアント自体をAPIとして選択しました。つまり、自分のRESTクライアントを使用するアプリケーションは、実際のREST URLと使用されているデータ形式を意識する必要はありません。

クライアントには2つのレイヤーがあります。

  1. トップレイヤー:このレイヤーの目的は、REST APIの機能を反映するメソッドを提供することです。たとえば、REST APIのすべてのURLに対応する1つのJavaメソッド(GETの場合は1つ、POSTの場合は2つ)を持つことができます。
    これは、RESTクライアントAPIへのエントリポイントです。これは、アプリケーションが通常使用するレイヤーです。シングルトンになる可能性はありますが、必ずしもそうではありません。
    REST呼び出しのレスポンスは、このレイヤーによってPOJOに解析され、アプリケーションに返されます。

  2. これはHTTPクライアントメソッドを使用して実際に外に出てそのREST呼び出しを行う、下位レベルの AsyncTask

さらに、私はコールバックメカニズムを使用して、 AsyncTask の結果をアプリに返信しました。

Enough of text. Let's see some code now. Lets take a hypothetical 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. 
* 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.
* This method is guaranteed to execute on the UI thread. */ public abstract void onPostSuccess(); }

アプリケーションでは、REST APIから直接返されたJSONまたはXML(またはその他の形式)は使用されません。代わりに、アプリケーションは Profile というBeanしか見ることができません。

次に、下位層(AsyncTask層)は次のようになります。

/**
 * An AsyncTask implementation for performing GETs on the Hypothetical REST APIs.
 */
public class GetTask extends AsyncTask{

    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{
        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を使用する方法(アクティビティまたはサービス)は次のとおりです。

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
            }
        });

私はコメントがデザインを説明するのに十分であることを願っています。私はより多くの情報を提供してうれしいです。

92
追加された
RoboSpliceは、Githubのページで競合他社のリストを持っています: github.com/octo-online/robospice
追加された 著者 Victor Sergienko,
かなり良いコードの例のために私はこの答えが好きです。ありがとう
追加された 著者 Marek Sebera,
1つの小さなこと、それらのGet/PostTaskの上で実行を呼び出す必要があります
追加された 著者 Mo Kargas,
@MoKargas確かに!指摘してくれてありがとう。投稿を更新しました。
追加された 著者 curioustechizen,
@MichaelHerbigはい、 GetResponseCallback をより一般的にする方法があります。私が好むものは、マーカーインターフェースを使用することです: interface IGetResopnse {} と同様に、応答できるすべてのクラスを示します。最後に、 IGetResponse を上限として GetResponseCallback を作成します:クラスプロファイルはIGetResponse public abstract class GetResponseCallback <? IGetResponse> を拡張します。
追加された 著者 curioustechizen,
@MichaelHerbigごめんなさい - 私の前のコメントの最後の行は、 public abstract class GetResponseCallback を読んでいるはずです。パラメータは T extends ... で、ではありません。 extends ...
追加された 著者 curioustechizen,
これは本当に素晴らしいです。どのようにGetResponseCallbackをより一般的なものにすると、プロファイルだけを戻すことはできませんか、APIからのデータの種類ごとに別々のGetResponseCallbackを作成することをお勧めしますか?
追加された 著者 user901309,
おそらく何の価値もないでしょうが、これはVirgil Dobjanschiが記述したように、適切なRESTful MVCのパターンには本当に従っていません。アプリケーションが直接使用するSQLiteデータベースを使用する完全なContentProviderレイヤーを組み込む必要があります。それ以外の場合、これはAndroid用の軽量なRESTクライアントです。
追加された 著者 Neeko,

Virgil Dobjanschi氏の「Android RESTクライアントアプリケーションの開発」では、セッション中にソースコードが提示されなかったか、後で提供されたため、多くの議論が行われました。

Datadroid (私が知っているのであればコメントしてください)は、私が知っている唯一のリファレンス実装ですアンダー/プレゼンテーション)。あなた自身のアプリケーションで使用できるライブラリです。

2番目のリンクは、スタックオーバーフローに大きく関わる「ベスト」RESTフレームワークを要求します。私の場合は、アプリケーションのサイズが重要であり、続いて実装が実行されます。

したがって、複雑なシナリオではorg.jsonまたはGSONを使用します。 org.json実装のアーキテクチャでは、サーバーの使用例(findPerson、getPersonなど)を表す静的クラスを使用しています。私はサービスからこの機能を呼び出し、マッピング(プロジェクト固有)とネットワークIO(プレーンGETまたはPOST用の自分のRESTテンプレート)を実行しているユーティリティクラスを使用します。私は反射の使用を避けようとします。

10
追加された
ヒント:ありがとうございました:私はAmazonでこの声明を見つけました:「第12章と第13章ではコンテンツプロバイダを扱います。サンプルコードとサンプルアプリケーションを使ってコンテンツプロバイダを広範囲に扱うことで、この技術の仕組みや、実際のプログラミング状況で使用することができます。URIを使用してデータを保存および参照するためのコンテンツプロバイダのフレームワークは、Androidオペレーティングシステムの斬新な機能の1つです。
追加された 著者 ChrLipp,
コードは github.com/bmeike/ProgrammingAndroid2Examples にあります(ただし、章はありません。初版コード github.com/bmeike/ProgrammingAndroidExamples
追加された 著者 ChrLipp,
誰もがこのコードをICS +で動かすことができましたか? FinchVideoの例の下のtodoファイルには、「ICSの下でクラッシュします」と簡潔に記載されています。私はコードの例が壊れていることを発見するために本を買った後、やや失望した...
追加された 著者 niallsco,
O'Reillyの書籍Androidプログラミングは、DobjanschiのRESTful MVCパターン(12-13章)を完全に実装しています。
追加された 著者 Neeko,

AsynTaskを使用してネットワーク要求や永続化する必要のあるものを実行しないでください。非同期タスクはあなたのアクティビティに強く結びついており、アプリケーションの再作成後にユーザーが画面の向きを変更すると、AsyncTaskが停止します。

Intent ServiceとResultReceiverでServiceパターンを使用することをお勧めします。 RESTDroid をご覧ください。これは、あらゆる種類のRESTリクエストを非同期的に実行し、Virgil Dobjanschiのサービスパターンを実装しているリクエストリスナを使用してUIに通知するライブラリです。

6
追加された

There is another library with much cleaner API and type-safe data. https://github.com/kodart/Httpzoid

ここに簡単な使用例があります

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

コールバックと複雑になる

Http http = HttpFactory.create(context);
http.post("http://example.com/users")
    .data(new User("John"))
    .handler(new ResponseHandler() {
        @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();

それは新鮮な新ですが、非常に有望に見えます。

3
追加された
Activityが終了するとAsyncTaskが終了するため、AsyncTaskで実行されているように見えます。
追加された 著者 Malachiasz,

そこにはたくさんの図書館があり、私はこれを使っています: https://github.com/nerde/安心してご利用いただけます。これは私によって作成されたもので、ドキュメントでわかるように、他のものよりもクリーンでシンプルです。それはAndroidに焦点を当てていませんが、私はそれを使用しており、それはかなりうまく動作しています。

HTTP Basic Authをサポートしています。 JSONオブジェクトをシリアライズおよびデシリアライズするのは面倒な作業です。特にあなたのAPIがRailsのようなものなら、それは好きでしょう。

1
追加された

免責事項:私はrest2mobileオープンソースプロジェクトに関与しています

RESTクライアントとしてのもう一つの選択肢は、 rest2mobile を使用することです。

このアプローチは、具体的な休憩の例を使用してRESTサービスのクライアントコードを生成するため、わずかに異なります。このコードは、REST URLとJSONペイロードをネイティブJavaメソッドとPOJOに置き換えます。また、サーバー接続、非同期呼び出し、JSON変換からPOJOへのPOJOも自動的に処理します。

このツールはさまざまな味(cli、プラグイン、アンドロイド/ ios/jsサポート)で提供され、アンドロイドスタジオプラグインを使用してアプリに直接APIを生成します。

すべてのコードは、こちらでご覧いただけます。

1
追加された
あなたのサイトを広告する代わりに、最初のリンクを実際のターゲットに置き換えてください。
追加された 著者 Skydan,