web-dev-qa-db-ja.com

REST AndroidのAPIクライアントライブラリ

Parse.comをバックエンドとして使用するロケーションベースのメッセージングアプリを構築しています(Parse.comはUrban Airship/PubNubなどに似ています)。より良い制御のために独自のバックエンドに切り替えたいと考えています。このために、REST AP​​Iで公開される機能を備えたnode.jsベースのバックエンドを構築しました

このAPIを使用するには、すべてのHTTPリクエスト/レスポンスまたは_を抽象化するAndroidライブラリ( Parse.comのAndroid SDK と同様)を構築します。REST AP​​I呼び出し。getUsers()、sendMessage()などのさまざまな操作に直接機能を提供します。

REST AP​​I ClientをAndroidに実装する方法:

ここで、Androidライブラリを構築し、ユーザーがアプリを操作しているときに同時にREST AP​​I呼び出しが発生する可能性があることを考えると、どちらのアプローチが最適でしょう?私は他の提案/推奨も受け入れています。

[〜#〜] update [〜#〜]:最初に、正常に機能するIntentService + ResultReceiverを使用して独自のライブラリを構築しました。しかし、後でつまずいたのは Android Async Http です。これを使って。それは素晴らしいです!

45
Madhur

Googleに基づいて私が見た最高の実装IO Pro Tips 2010はRoboSpiceライブラリで、これはRESTベースであり、アクティビティライフサイクルでメモリをリークします。

クイック infographic ライブラリは here

  • ローダーは、RESTではなくデータベース用に設計されています。アクティビティのリセット時にリセットされるため、データが失われます。
  • 非同期タスク、ただ。
  • Intent Service + Resultレシーバーは基本的にRoboSpiceの動作方法であるため、独自のライブラリを構築する場合は、このアプローチを採用します。
  • IntentServiceメソッドと同様に、サービスも優れていますが、この場合はIntentServiceの方が少しうまく機能します。

Serviceメソッドの方が良いかもしれません。 robospiceサービスを見るExecutorServiceを使用するServiceを使用してRequestsを使い果たすと、これはJava並行性Android特定よりも重要です。サービスは実行中に実行されることに注意してください。処理要求は、それらが残っていない場合、自己を終了します。

ExecutorServiceまたは任意のタイプのスレッドプールを使用する利点は、一度に実行できるリクエストの数を定義できることです。あなたが非常に高速な接続を持っている場合を除き、2-4が私がこれまでに提案したほとんどです。

43
Chris.Jenkins

このクラスは助けになるかもしれません:-

/*Copyright 2014 Bhavit Singh Sengar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.Apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/

package com.infotech.zeus.util;

import Java.io.IOException;
import Java.io.UnsupportedEncodingException;
import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.ResponseHandler;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.StringEntity;
import org.Apache.http.impl.client.BasicResponseHandler;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.protocol.HTTP;
import org.Apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import Android.widget.Toast;

public class RestClient {


        JSONObject data = new JSONObject();
        String url;
        String headerName;
        String headerValue;

        public RestClient(String s){

            url = s;
        }


        public void addHeader(String name, String value){

            headerName = name;
            headerValue = value;

        }

        public void addParam(String key, String value){

            try {
                data.put(key, value);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        public String executePost(){  // If you want to use post method to hit server

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(headerName, headerValue);
            HttpResponse response = null;
            String result = null;
            try {
                StringEntity entity = new StringEntity(data.toString(), HTTP.UTF_8);
                httpPost.setEntity(entity);
                response = httpClient.execute(httpPost);
                HttpEntity entity1 = response.getEntity();
                result = EntityUtils.toString(entity1);
                return result;
                //Toast.makeText(MainPage.this, result, Toast.LENGTH_LONG).show();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;



        }

        public String executeGet(){ //If you want to use get method to hit server

            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(url);
            String result = null;
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            try {
                result = httpClient.execute(httpget, responseHandler);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return result;
        }
}

このクラスを使用する簡単な例:

RestClient client = new RestClient("http://www.example.com/demo.php");  //Write your url here
        client.addParam("Name", "Bhavit"); //Here I am adding key-value parameters
        client.addParam("Age", "23");

        client.addHeader("content-type", "application/json"); // Here I am specifying that the key-value pairs are sent in the JSON format

        try {
            String response = client.executePost(); // In case your server sends any response back, it will be saved in this response string.

        } catch (Exception e) {
            e.printStackTrace();
        }
8

Retrofit を使用しましたが、エンドポイントを管理し、データ/コレクション/オブジェクトを解析するための簡単な構造を提供する本当に良いライブラリです。

ドキュメントは、コードを簡単に書くのに十分なものです。

CQFD>どうぞ

7
Hugo Gresse

RESTDroid を使用することもできます。 RoboSpiceに非常に似ていますが、使用が簡単です(ただし、強力ではありません)。

RESTDroid用のParse.comモジュールを作成する場合は、GitHubに追加してください。

4

もう1つ追加すると、エンジン(= iOSのMKNetworkKitで使用される)とAndroidのREST APIと通信するコマンド)を実装するためのNiceライブラリの作成を開始しました。到達しようREST API。 https://github.com/m2d2/MDBaseAndroidLibraries

1
dineth

Android Annotationswithrest-springこれらのタスクを自動的に行うプラグイン。

Androidのspringフレームワークのラッパーを使用し、実際に適切な処理方法を提供しますrest API

例:

AsyncTask-> doInBackground()を@Backgroundアノテーションに置き換えます:

@Background
protected void backgroundWork(){
    // do something in background
}

runOnUiThread、onPostExecute()を@UiThreadに置き換えます

@UiThread
protected void uiWork(){
    // do something on UI Thread
}

REST APIの場合

残りのクライアントを作成:

@Rest(rootUrl = "http://company.com/ajax/services",
      converters = { MappingJackson2HttpMessageConverter.class })
public interface MyRestClient {

    @Get("/events")
    EventList getEvents();
}

残りのクライアントを使用:

@RestClient
MyRestClient myRestClient;

public void showAllEvents(){
    EventList list = myRestClient.getEvents();
    // do something with this list

}
1
user5934402