Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

He escrito 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 debo hacerlo?

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

  • Recomendaciones para el formato / protocolo de .NET Web Service para Android, iPhone, etc.
  • En caché JSON de webservice en android - patrón?
  • Cuál es el papel de la clave de la aplicación y la clave secreta en cada SDK
  • Android: ¿Cómo enviar datos a MySQL DB sin usar JDBC, PHP o cualquier otro servicio web?
  • ¿Qué authTokenType significa exactamente?
  • Solicitudes seguras de servicio web
  • Conectando MySql con Android sin usar PHP
  • API de servidor para aplicaciones móviles
  • 10 Solutions collect form web for “¿Cómo llamar a un servicio web RESTful de Android?”

    Esta es una clase restclient de ejemplo

     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<NameValuePair> headers,ArrayList<NameValuePair> 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<NameValuePair> addCommonHeaderField(ArrayList<NameValuePair> _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 descubrió 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<Repo> listRepos(@Path("user") String user,Callback<List<User>> cb); } 

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

    La biblioteca maneja la serialización json y deserailization para usted. También puede personalizar la serialización y la deserializació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 cliente REST 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/

    ¡Pare con lo que estaba haciendo! 🙂

    Implementar el cliente RESTful como un servicio y delegar el material de red intensiva a componente independiente de la actividad: un servicio.

    Mira este video perspicaz http://www.youtube.com/watch?v=xHXn3Kg2IQE donde Virgil Dobjanschi está explicando su enfoque (es) a este reto …

    Utilicé OkHttpClient para llamar al servicio de red de descanso. 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 JAVA entonces usted puede utilizar REST con Java (JAX-RS) usando Jersey.

    En el lado de Android puede utilizar este RestClient simple para trabajar con ese servicio REST.

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

    Tal vez tarde o tal vez ya lo ha utilizado antes, pero hay otro llamado ksoap y su bastante sorprendente .. También incluye tiempos de espera y puede analizar cualquier webservice basado en SOAP eficientemente. También hice algunos cambios para adaptarme a mi análisis. Busque

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

    Paso 1

    Cree un proyecto en blanco de Android.

    Paso 2

    Necesita permiso de acceso a Internet. Escriba el siguiente código en el archivo AndroidManifest.xml.

      <uses-permission android:name="android.permission.INTERNET"> </uses-permission> 

    Paso 3

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

    Etapa 4

    Haga un RestFul Client que extenderá AsyncTask. Vea RestFulPost.java.

    Paso 5

    Hacer DTO clase para RestFull solicitud y respuesta.

    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<map, void,="" string=""> { 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 detalles y el código completo, visite http://javaant.com/consume-a-resident-webservice-in-android/#.VwzbipN96Hs

    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"); 

    Aquí está mi biblioteca que he creado para la simple llamada de Webservice,

    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 de usar.

    https://github.com/vishalchhodwani1992/httpLibrary

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.