Подтвердить что ты не робот

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

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

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

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

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

ОБНОВЛЕНИЕ. Сначала мы создали собственную библиотеку с помощью IntentService + ResultReceiver, которая отлично работала. Но позже мы наткнулись на Android Async Http. Используй это. Это потрясающе!

4b9b3361

Ответ 1

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

Быстрый infographic библиотека здесь

  • Погрузчики предназначены для базы данных, а не для REST, они reset для активности reset означают, что вы теряете свои данные.
  • Асинхронная задача, просто нет.
  • Intent Service + Результирующий приемник в основном работает с RoboSpice, поэтому, если вы создаете свою собственную библиотеку, я бы использовал этот подход!
  • Сервис также хорош, как и метод IntentService, но IntentService работает в этом случае немного лучше.

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

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

Ответ 2

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

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

Ответ 3

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

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

CQFD > пойдите для него

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Они используют оболочку в spring для 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
}

Для API-интерфейсов Rest

создать клиент для отдыха:

@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

}