Клиентская библиотека REST API для Android

мы создаем приложение для обмена сообщениями на основе местоположения, которое использует Parse.com как back-end (Parse.com похож на Urban Airship / PubNub и т. д.), И теперь мы хотим переключиться на наш собственный бэк-энд для лучшего контроля. Для этого мы построили узел.JS на основе back-end с функциональностью, предоставляемой через REST API

чтобы использовать этот API, мы хотим создать библиотеку Android (аналогичноParse.com ' s Android SDK), который абстрагирует все HTTP-запросы / ответы или вызовы REST API и предоставляет прямые функции для различных операций, таких как getUsers (), sendMessage () и т. д.

способы реализации REST API Client в Android:

теперь, учитывая, что мы хотим построить библиотеку android, и могут быть одновременные вызовы REST API во время пользователь взаимодействует с приложением, какой подход будет лучше идти вперед ? Я также открыт для других предложений / рекомендаций.

обновление: сначала мы создали собственную библиотеку с помощью IntentService + ResultReceiver, которая работала нормально. Но позже мы наткнулись на Android Async Http. Использовать его. Это потрясающе!

6 ответов


Лучшая имплиментация, которую я видел на основе Google IO Pro Tips 2010, - это библиотека RoboSpice, которая основана на REST и очень умно работает с жизненным циклом активности, чтобы не утечка памяти.

быстрая инфографики библиотека здесь

  • загрузчики предназначены для базы данных, а не отдыха, они сбрасываются при сбросе активности, что означает, что вы теряете свои данные.
  • асинхронная задача, просто нет.
  • Умысел Сервис + Result receiver-это в основном работа RoboSpice, поэтому, если вы создаете свой собственный lib, я бы выбрал этот подход!
  • сервис также хорош, похож на метод IntentService, но IntentService работает немного лучше в этом случае.

на Service способ может быть лучше, посмотрите на службу robospice они использовать ExecutorService который завершает Service когда он закончился Requests для работы, это больше параллелизма Java, чем Android специфический. Главное отметить, что служба запускается во время обработки запросов, а затем завершает свою работу, если их не осталось.

преимущества использования ExecutorService или любой тип пула потоков - это то, что вы можете определить, сколько запросов вы можете запускать одновременно. если у вас нет очень быстрого соединения 2-4, это самое большее, что я когда-либо предлагал.


МОЖЕТ БЫТЬ, ЭТОТ КЛАСС МОЖЕТ ПОМОЧЬ : -

/*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();
        }

Я использовал модернизация и это действительно хорошая библиотека, которая обеспечивает простую структуру для управления конечными точками и анализа данных/коллекций/объектов.

документация достаточно полная, чтобы легко писать код.

CQFD > go for it


вы также можете использовать RESTDroid. Он очень похож на RoboSpice, но проще в использовании (хотя и менее мощный.)

Если вы создадите Parse.com модуль для RESTDroid, не стесняйтесь добавлять его на GitHub!


Если я могу добавить еще одну вещь, я недавно начал писать хорошую библиотеку для реализации движков (как используется MKNetworkKit в iOS) и команд для связи с REST APIs для Android. Может быть полезно для тех, кто пытается достичь REST APIs. https://github.com/m2d2/MDBaseAndroidLibraries


вы также можете попробовать Android Аннотации С остальное-весной. плагин для выполнения этих задач автоматически.

они используют обертку на spring framework для android и обеспечить действительно хороший способ обработки rest apis.

примеры:

заменить 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:

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

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

используйте клиент rest:

@RestClient
MyRestClient myRestClient;

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

}