1. ホーム
  2. java

[解決済み] Virgil Dobjanschi REST実装パターンを実装したAndroid REST Clientのサンプルプロジェクトが必要です。

2023-06-28 03:53:26

質問

アンドロイド携帯でRESTクライアントを作りたいのですが、どうすればいいですか?

RESTサーバはいくつかのリソースを公開しており、例えば(GET)

http://foo.bar/customer      List of all customer
http://foo.bar/customer/4711    The customer with id 4711
http://foo.bar/customer/vip     List of all VIP customer

http://foo.bar/company           List of all companys
http://foo.bar/company/4711     The company with the ID 4711
http://foo.bar/company/vip      List of all VIP companys

RESTサーバと会話して必要な情報を取得する方法は分かっている(と思う)。私は次のようなAPIを持つRESTクライアントクラスを実装します。

public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();

public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();

プレゼンテーション"を参照しました。 Android RESTクライアントアプリケーションを開発する Virgil Dobjanschiから、RESTリクエストをActivityのWorker Threadで処理するのは良いアイデアではないことを学びました。代わりに サービス APIを使うべきです。

私は(ローカル)サービスにバインドするSingleton ServiceHelperを持つというアイデアが好きですが、私はサービスの概念を正しく理解していなかったと恐れています。

今のところ、REST呼び出しの結果(サービス内で非同期的に行われる)を呼び出し元のアクティビティに報告する方法を理解していません。また、すべてのRESTリクエスト(異なる戻り値のタイプ)を処理する1つのサービスが必要なのか、または各RESTリクエストに専用のサービスが必要なのか、疑問に思っています。

おそらく、私は他にも多くの理解できない問題を抱えているので、私にとって最も良いのは サンプルアプリケーション がベストだと思います。私のユースケースは珍しいものではないので、サンプルアプリケーションがあることを望みます。

あなたは私に知らせてください

正しい実装の方向に私を指し示す他の任意の提案はまた有用である(Android API-デモは私のユースケースに一致しません)。

事前にありがとうございます。

クラウス

EDIT : 同様のトピックがSOで見つかり(これを投稿した後)、私が必要とする方向(複雑な "Dobjanschi pattern" を最小化する)に導いてくれました。

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

オーバービュー

編集する。

誰か興味のある人は、次のサイトも見てみてください。 RESTfulアンドロイド を見てみてください。

Dobjanschiモデルを実装しようとした経験から学んだことは、すべてが石に書かれているわけではなく、アプリごとに変わるかもしれませんが、公式はどうなっているのかの概要を示しているだけだということです。

このアイデアに従う + 自分のアイデアを加える = 幸せなAndroidアプリケーション

アプリによっては、SyncAdapterにアカウントを必要としないものや、C2DMを使用するものなど、要件とは異なるモデルがあるかもしれません。


アカウントと AccountManager を持つアプリケーションを作成する。

SyncAdapterを使用してデータを同期させることができます。これについては 独自の SyncAdapter を作成する

を作成します。 ContentProvider を作成します (ニーズに合っている場合)。

この抽象化により、データベースにアクセスできるだけでなく、REST Archと1対1のMappingメソッドを持っているので、ServiceHelperに行き、RESTコールを実行することができます。

コンテンツプロバイダ|RESTメソッド

クエリ ----------------> GET

挿入 ----------------> PUT

更新 ----------------> POST

削除 ----------------> DELETE

ServiceHelperのレイヤー化

これは基本的に、ContentProviderから渡されたパラメータでHttp(必ずしもプロトコルではないが、最も一般的なもの)のRESTメソッドを実行するサービス(複数可)を開始します。コンテンツプロバイダのUriMatcherから取得したマッチング整数を渡したので、どのRESTリソースにアクセスすればよいかがわかる。

class ServiceHelper{

    public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters 
    }

}

サービス内容

ヘルパーから渡されたパラメータでRESTMethodに移動します。

また、BroadCastReceiverを実装して、サービスが作業を終えたら、このBroadcastを登録したActivityに通知して、再度問い合わせをするようにします。この最後のステップはVirgill Conferenceには載っていないと思いますが、良い方法だと思います。

RESTMethodクラス

パラメータを受け取り、WSリソース( http://myservice.com/service/path ) がパラメータを追加し、すべてを準備し、呼び出しを実行し、応答を保存します。

authtokenが必要な場合は、AccountManagerから要求することができます。 認証に失敗した場合は、一度認証トークンを無効にしてから再認証することで、新しいトークンを取得できます。

最後にRESTMethodはXMLかJSONのどちらかを返しますが、マッチャーに基づいたプロセッサを作成し、レスポンスを渡します。

プロセッサ

レスポンスを解析し、ローカルに挿入する役割を担っています。

サンプルアプリケーション?もちろんです。

また、テストアプリケーションに興味がある方は エリG これは最高の例ではないかもしれませんが、Service RESTのアプローチに従っており、ServiceHelper, Processor, ContentProvider, Loader, and Broadcastで構築されています。