lista - REST API Client Library para Android
lista de apis publicas (6)
Estamos construyendo una aplicación de mensajería basada en la ubicación que usa Parse.com como back-end (Parse.com es similar a Urban Airship / PubNub, etc.) y ahora queremos cambiar a nuestro propio back-end para un mejor control. Para esto, hemos construido un back-end basado en node.js con la funcionalidad expuesta sobre la API REST
Para consumir esta API, queremos construir una biblioteca de Android (similar al SDK de Android de Parse.com ) que abstraiga todas las llamadas de respuesta / HTTP o API de REST y proporcione funciones directas para varias operaciones como getUsers (), sendMessage (), etc.
Formas de implementar REST API Client en Android:
- Uso de IntentService + ResultReceiver
- Servicio
- AsyncTask
- Uso de Loaders
Ahora, considerando que queremos construir una biblioteca de Android y podría haber llamadas REST API simultáneas mientras el usuario está interactuando con la aplicación, ¿qué enfoque sería el mejor para seguir adelante? Estoy abierto a otras sugerencias / recomendaciones también.
ACTUALIZACIÓN : Primero construimos nuestra propia biblioteca usando IntentService + ResultReceiver que funcionó bien. Pero luego nos topamos con Android Async Http . Úselo. ¡Es impresionante!
He usado Retrofit y es una biblioteca realmente buena que proporciona una estructura fácil para administrar puntos finales y analizar datos / colecciones / objetos.
La documentación es lo suficientemente completa como para escribir fácilmente su código.
CQFD> ve por ello
La mejor implementación que he visto en base a Google IO Pro Tips 2010 es la biblioteca RoboSpice, que está basada en REST y funciona muy inteligentemente con el ciclo de vida de la actividad para no perder memoria.
infographic rápida la biblioteca está here
- Los cargadores están diseñados para bases de datos, no REST, se restablecen al restablecer la actividad, lo que significa que pierde sus datos.
- Tarea asincrónica, simplemente no.
- El servicio de intenciones + receptor de resultados es básicamente cómo funciona RoboSpice, así que si estás construyendo tu propia libra, ¡tomaría este enfoque!
- El servicio también es bueno, similar al Método IntentService, pero IntentService funciona un poco mejor en este caso.
El método de Service
puede ser mejor, observe el servicio de robospice que utilizan un ExecutorService
que finaliza el Service
cuando se ha quedado sin Requests
para trabajar, esto es más concurrencia de Java que específica de Android. Lo principal es observar que el servicio se ejecuta mientras se procesan las solicitudes y luego se cancela si no queda ninguno.
La ventaja de utilizar ExecutorService
o cualquier tipo de grupo de subprocesos es que puede definir cuántas solicitudes puede ejecutar al mismo tiempo. a menos que tengas una conexión muy rápida 2-4 es lo máximo que alguna vez sugeriría.
Si puedo agregar algo más, recientemente comencé a escribir una buena biblioteca para implementar Engines (como la usa MKNetworkKit en iOS) y Commands para comunicarme con API REST para Android. Podría ser útil para cualquiera que intente llegar a las API REST. https://github.com/m2d2/MDBaseAndroidLibraries
También puede probar Anotaciones de Android con el complemento de descanso y primavera para realizar estas tareas automáticamente.
Usan una envoltura en el marco de primavera para Android y proporcionan una muy buena manera de manejar apis de descanso .
Ejemplos:
Reemplace AsyncTask -> doInBackground () con la anotación @Background:
@Background
protected void backgroundWork(){
// do something in background
}
Reemplace runOnUiThread, onPostExecute () con @UiThread
@UiThread
protected void uiWork(){
// do something on UI Thread
}
Para Rest API''s
crear cliente de descanso:
@Rest(rootUrl = "http://company.com/ajax/services",
converters = { MappingJackson2HttpMessageConverter.class })
public interface MyRestClient {
@Get("/events")
EventList getEvents();
}
usar el cliente de descanso:
@RestClient
MyRestClient myRestClient;
public void showAllEvents(){
EventList list = myRestClient.getEvents();
// do something with this list
}
También puedes usar RESTDroid . Es bastante similar a RoboSpice pero más fácil de usar (aunque también menos potente).
Si creas un módulo de Parse.com para RESTDroid, ¡no dudes en agregarlo a GitHub!
PUEDE SER ESTA CLASE PUEDE AYUDAR: -
/*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;
}
}
UN SIMPLE EJEMPLO PARA USAR ESTA CLASE:
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();
}