[解決済み] Android REST クライアント、サンプル?
質問
このスレッドが回答を受け付けている場合でも、他のアイデアを自由に提案することができます。
こんな記事にも出会いました。
そして、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つのレイヤーを持つことになります。
-
トップレイヤー。このレイヤーの目的は、REST APIの機能を反映したメソッドを提供することです。例えば、REST APIのすべてのURLに対応する1つのJavaメソッドを持つことができます(あるいは、GET用とPOST用の2つを持つこともできます)。
これはRESTクライアントAPIへのエントリポイントです。これは、アプリが通常使用する層です。シングルトンである可能性もありますが、必ずしもそうではありません。
REST呼び出しの応答は、このレイヤーによってPOJOにパースされ、アプリに返されます。 -
これは、低レベルの
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
}
});
このコメントでデザインを説明するのに十分だと思いますが、もっと情報を提供していただけると嬉しいです。
関連
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Junitのユニットテストはjava.lang.Testを報告します。
-
java 365*1000*60*60*24 計算問題
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] SOAPとRESTの比較(相違点)
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
シェルコマンドやスクリプトのJavaコール
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み】Restful APIサービス