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


115

このスレッドが回答を受け入れたとしても、他のアイデアを自由に提案してください。


私はこれらの記事に会いました:

RESTクライアントアプリケーションに関するこのGoogle I / O 2010ビデオに私を導きました

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

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

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


こんにちは、私は「ws」という名前のWebサービス用に個別のパッケージを開発しています。「WebServicUtils.java」という名前のクラスを一般化しています。WebServiceUtils.javaクラスには、Webサービスにアクセスするためのメソッドがあります。私のテクニックが最高かどうかはわかりませんが、私のwsパッケージをAndroidアプリケーションにコピーするたびに再利用できます。私のテクニックについて詳しく知りたい場合は、お知らせください。
Ketan Parmar、2011

私はYouTubeのコメンターがより良い代替手段を持っているとは思いません。私たちはAndroidのAPI内で作業する必要があります。たとえそれらがめちゃくちゃに複雑すぎて冗長なナンセンスであることもしばしばです。
Timmmm 2012

補足として、Android用のオープンソースのEclipseプラグインであるMechanoidは、シンプルなDSLを使用してJSON-RESTクライアントを生成できます。その使用方法のガイドは、robotoworks.com / mechanoid-plugin / service-client-dslにあります(私はこのプラグインの作者です、恥知らずなプラグインで申し訳ありません!)
Ian Warwick

これは、Android RESTクライアントの実装を学ぶ人にとって非常に役立つかもしれません。PDFへのDobjanschiのプレゼンテーション転写:drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/...
ケイゼッド

回答:


99

編集2(2017年10月):

それは2017年です。レトロフィットを使用してください。他のものを使用する理由はほとんどありません。

編集:

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

元の回答は参照用に以下に保持されています。ただし、Android向けのRestクライアントライブラリをいくつか調べて、それらがユースケースに適合するかどうかを確認してください。以下は、私が評価したいくつかのライブラリのリストです。網羅的なリストを意図したものではありません。


元の回答:

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

私のアプローチでは、単にAsyncTasksを使用しています。私の場合、Activityインスタンスからこれらのタスクを「呼び出し」ます。しかし、画面の回転などのケースを完全に説明するには、Serviceそれらをなどから呼び出すことを選択できます。

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

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

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

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

さらに、AsyncTasksの結果をアプリに返すためにコールバックメカニズムを使用することを選択しました。

十分なテキスト。今いくつかのコードを見てみましょう。架空の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
            }
        });

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


かなり良いコードの例のため、私はこの答えをもっと好きです。ありがとう
Marek Sebera

1
Virgil Dobjanschiによって説明されているように、おそらく何も価値がありませんが、これは適切なRESTful MVCパターンに実際には従いません。アプリが直接使用するSQLiteデータベースを使用する完全なContentProviderレイヤーを組み込む必要があります。それ以外の場合、これはAndroid向けの優れた軽量RESTクライアントです。
クーパー

1
小さなことの1つは、Get / PostTaskの実行を呼び出す必要があることです
Mo Kargas 2012

1
これは本当に素晴らしいです。GetResponseCallbackをより汎用的にしてプロファイルのみを返さないようにするにはどうすればよいですか、またはAPIからのデータのタイプごとに個別のGetResponseCallbackを作成することをお勧めしますか?

1
@MichaelHerbigはい、GetResponseCallbackより一般的にする方法があります。私が好む1が使用することですマーカーインターフェイスのように:interface IGetResopnse{} 回答可能性があり、すべてのクラスを示すために。その後、私が持っているclass Profile implements IGetResponse最後に、など作るGetResponseCallbackと、一般的なIGetResponse上限としてpublic abstract class GetResponseCallback<? extends IGetResponse>
curioustechizen 2013年

11

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

私が知っている唯一の参照実装(詳細がわかればコメントしてください)はDatadroidで入手できます(Google IOセッションは/ presentationで説明されています)。独自のアプリケーションで使用できるライブラリです。

2番目のリンクは、「最適な」RESTフレームワークを要求します。これは、stackoverflowで詳しく説明されています。私にとっては、アプリケーションのサイズが重要で、次に実装のパフォーマンスが続きます。

  • 通常、私はプレーンなorg.json実装を使用します。これは、APIレベル1以降のAndroidの一部であるため、アプリケーションのサイズは増加しません。
  • 私にとって非常に興味深いのは、コメント内のJSONパーサーのパフォーマンスに関する情報でした。Android3.0 Honeycomb以降、GSONのストリーミングパーサーはandroid.util.JsonReaderとして含まれています。残念ながら、コメントはもう利用できません。
  • Spring Android(時々使用します)は、JacksonとGSONをサポートしています。春のAndroid RestTemplateモジュールのドキュメントを指すサンプルアプリ

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


4
O'Reillyの本 『Programming Android』は、DobjanschiのRESTful MVCパターンの完全な実装を特徴としています(12〜13章)。
クーパー

ヒントをありがとう:アマゾンでこのステートメントを見つけました:「第12章と第13章はコンテンツプロバイダーを扱っています。サンプルコードとサンプルアプリケーションでコンテンツプロバイダーを広範囲に扱うことで、このテクノロジーの仕組みと、それがどのように機能するかについて、いくつかの新しい洞察を得ることができました。実際のプログラミング状況で使用できます。URIを使用してデータを保存および参照するコンテンツプロバイダーフレームワークは、Androidオペレーティングシステムの斬新な機能の1つです。テクノロジーを段階的に説明するのに非常に役立ちます。」
ChrLipp

2
コードはgithub.com/bmeike/ProgrammingAndroid2Examplesにあります(ただし、章が欠落しているため、最初のエディションのコードgithub.com/bmeike/ProgrammingAndroidExamplesで見つけることができます)
ChrLipp

誰かがこのコードをICS +で実行することができましたか?FinchVideoの例のtodoファイルには、「ICSでのクラッシュ」と簡潔に記載されています。本を購入してコード例が壊れていることを発見した後、少しがっかりしました...
熱心なアナリスト

7

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

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


3

よりクリーンなAPIとタイプセーフなデータを備えた別のライブラリがあります。 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<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();

新鮮ですが、非常に有望に見えます。


AsyncTaskで実行されているようです。アクティビティが終了するとAsyncTaskが強制終了されるため、長時間実行されるリクエストやアクティビティ間の切り替えには適していません。
Malachiasz 2014年

1

そこにはたくさんのライブラリがあり、私はこれを使用していますhttps : //github.com/nerde/rest-resource。これは私が作成したものであり、ドキュメントを見るとわかるように、他のドキュメントよりもクリーンでシンプルです。それはAndroidに焦点を当てていませんが、私はそれを使用しており、かなりうまく機能しています。

HTTP基本認証をサポートしています。JSONオブジェクトのシリアライズとデシリアライズという汚い仕事をします。特に、APIがRailsのようなものである場合は、気に入っていただけます。


1

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

RESTクライアントとしてのもう1つの方法は、rest2mobileを使用することです

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

このツールはさまざまなフレーバー(cli、プラグイン、android / ios / jsサポート)で提供されており、android studioプラグインを使用してアプリに直接APIを生成できます。

すべてのコードはgithubのこちらにあります


3
サイトを宣伝するのではなく、最初のリンクを実際のターゲットに置き換えてください。
Skydan 2016

0

Android向けの軽量非同期RESTクライアントライブラリをオープンソース化しています。最小限の要件があり、マルチスレッドを自分で処理したくない場合に便利です。基本的な通信には問題ありませんが、本格的なRESTクライアントには適していません。図書館。

これはlibRESTfulClientと呼ばれ、GitHubにあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.