¿Cómo llamar a un servicio web RESTful desde Android?

Escribí un servicio web REST en Netbean IDE utilizando Jersey Framework y Java.

Para cada solicitud, el usuario debe proporcionar un nombre de usuario y una contraseña, sé que esta autenticación no es una buena práctica (usando un comando curl como: curl -u username:password -X PUT http://localhsot:8080/user ) .

Ahora quiero llamar a un servicio web REST de una clase de Android.

¿Cómo debería hacerlo?

Tengo una clase de Android que usa DefaultHttpClient y CredentialUsernameAndPassword , pero cuando lo ejecuto en Eclipse, a veces recibo una excepción de tiempo de ejecución o una excepción de SDK.

Esta es una clase de ejemplo restclient

 public class RestClient { public enum RequestMethod { GET, POST } public int responseCode=0; public String message; public String response; public void Execute(RequestMethod method,String url,ArrayList headers,ArrayList params) throws Exception { switch (method) { case GET: { // add parameters String combinedParams = ""; if (params!=null) { combinedParams += "?"; for (NameValuePair p : params) { String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8"); if (combinedParams.length() > 1) combinedParams += "&" + paramString; else combinedParams += paramString; } } HttpGet request = new HttpGet(url + combinedParams); // add headers if (headers!=null) { headers=addCommonHeaderField(headers); for (NameValuePair h : headers) request.addHeader(h.getName(), h.getValue()); } executeRequest(request, url); break; } case POST: { HttpPost request = new HttpPost(url); // add headers if (headers!=null) { headers=addCommonHeaderField(headers); for (NameValuePair h : headers) request.addHeader(h.getName(), h.getValue()); } if (params!=null) request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); executeRequest(request, url); break; } } } private ArrayList addCommonHeaderField(ArrayList _header) { _header.add(new BasicNameValuePair("Content-Type","application/x-www-form-urlencoded")); return _header; } private void executeRequest(HttpUriRequest request, String url) { HttpClient client = new DefaultHttpClient(); HttpResponse httpResponse; try { httpResponse = client.execute(request); responseCode = httpResponse.getStatusLine().getStatusCode(); message = httpResponse.getStatusLine().getReasonPhrase(); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); response = convertStreamToString(instream); instream.close(); } } catch (Exception e) { } } private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); } catch (IOException e) { } return sb.toString(); } } 

Recientemente descubrí que una biblioteca de terceros – Square Retrofit puede hacer el trabajo muy bien.


Definición del punto final REST

 public interface GitHubService { @GET("/users/{user}/repos") List listRepos(@Path("user") String user,Callback> cb); } 

Obteniendo el servicio concreto

 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class); 

Llamar al punto final REST

 List repos = service.listRepos("octocat",new Callback>() { @Override public void failure(final RetrofitError error) { android.util.Log.i("example", "Error, body: " + error.getBody().toString()); } @Override public void success(List users, Response response) { // Do something with the List of Users object returned // you may populate your adapter here } }); 

La biblioteca maneja la serialización y desexpalación JSON por usted. Puede personalizar la serialización y la deserialización también.

 Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Date.class, new DateTypeAdapter()) .create(); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setConverter(new GsonConverter(gson)) .build(); 

Yo uso este REST Client para mi android. Esto se ve muy bien. Buen trabajo de Luke.

http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

Detener con lo que sea que estuvieras haciendo! 🙂

Implemente el cliente RESTful como SERVICIO y delegue el material de red intensivo al componente independiente de la actividad: un SERVICIO.

Mire este video perspicaz http://www.youtube.com/watch?v=xHXn3Kg2IQE donde Virgil Dobjanschi explica su enfoque (es) ante este desafío …

Uso de Spring para Android con RestTemplate https://spring.io/guides/gs/consuming-rest-android/

 // The connection URL String url = "https://ajax.googleapis.com/ajax/" + "services/search/web?v=1.0&q={query}"; // Create a new RestTemplate instance RestTemplate restTemplate = new RestTemplate(); // Add the String message converter restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); // Make the HTTP GET request, marshaling the response to a String String result = restTemplate.getForObject(url, String.class, "Android"); 

OkHttpClient para llamar a un servicio web tranquilo. Es muy sencillo.

 OkHttpClient httpClient = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); Response response = httpClient.newCall(request).execute(); String body = response.body().string() 

¿Qué back-end? Si es JAVA, entonces puede usar REST con Java (JAX-RS) usando Jersey.

En el lado de Android puedes usar este simple RestClient para trabajar con ese servicio REST.

Para el mapeo de objetos JSON < -> en ambos lados (Android, back-end de Java) puede usar GSON.

Tal vez llego tarde o quizás ya lo haya usado antes, pero hay otro llamado ksoap y es bastante sorprendente. También incluye tiempos de espera y puede analizar cualquier servicio web basado en SOAP de manera eficiente. También hice algunos cambios para adaptarme a mi análisis … Búscalo

Siga los pasos a continuación para consumir RestFul en Android.

Paso 1

Crea un proyecto en blanco de Android.

Paso 2

Necesita permiso de acceso a internet. escriba el siguiente código en el archivo AndroidManifest.xml.

    

Paso 3

Necesita la url de RestFul que se ejecuta en otro servidor o en la misma máquina.

Etapa 4

Haga un cliente RestFul que extenderá AsyncTask. Ver RestFulPost.java.

Step5

Haga la clase DTO para RestFull Request and Response.

RestFulPost.java

 package javaant.com.consuming_restful.restclient; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.google.gson.Gson; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.util.Map; import javaant.com.consuming_restful.util.Util; /** * Created by Nirmal Dhara on 29-10-2015. */ public class RestFulPost extends AsyncTask { RestFulResult restFulResult = null; ProgressDialog Asycdialog; String msg; String task; public RestFulPost(RestFulResult restFulResult, Context context, String msg,String task) { this.restFulResult = restFulResult; this.task=task; this.msg = msg; Asycdialog = new ProgressDialog(context); } @Override protected String doInBackground(Map... params) { String responseStr = null; Object dataMap = null; HttpPost httpost = new HttpPost(params[0].get("url").toString()); try { dataMap = (Object) params[0].get("data"); Gson gson = new Gson(); Log.d("data map", "data map------" + gson.toJson(dataMap)); httpost.setEntity(new StringEntity(gson.toJson(dataMap))); httpost.setHeader("Accept", "application/json"); httpost.setHeader("Content-type", "application/json"); DefaultHttpClient httpclient= Util.getClient(); HttpResponse response = httpclient.execute(httpost); int statusCode = response.getStatusLine().getStatusCode(); Log.d("resonse code", "----------------" + statusCode); if (statusCode == 200) responseStr = EntityUtils.toString(response.getEntity()); if (statusCode == 404) { responseStr = "{\n" + "\"status\":\"fail\",\n" + " \"data\":{\n" + "\"ValidUser\":\"Service not available\",\n" + "\"code\":\"404\"\n" + "}\n" + "}"; } } catch (Exception e) { e.printStackTrace(); } return responseStr; } @Override protected void onPreExecute() { Asycdialog.setMessage(msg); //show dialog Asycdialog.show(); super.onPreExecute(); } @Override protected void onPostExecute(String s) { Asycdialog.dismiss(); restFulResult.onResfulResponse(s,task); } } 

Para obtener más información y un código completo, visite http://javaant.com/consume-a-restful-webservice-in-android/#.VwzbipN96Hs

Aquí está mi biblioteca que he creado para llamadas a servicios web simples,

Puede usar esto agregando una dependencia de gradle de una línea –

 compile 'com.scantity.ScHttpLibrary:ScHttpLibrary:1.0.0' 

Aquí está la demostración del uso.

https://github.com/vishalchhodwani1992/httpLibrary