Acceder a los datos de Salesforce mediante API de REST
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Crear una instancia de una solicitud REST con la clase RestClient.
- Generar una solicitud REST asíncrona con las clases RestClient y RestRequest.
- Recibir y procesar una respuesta REST con la clase RestResponse.
Uso de API de REST
Cuando esté listo para acceder a los datos de Salesforce en su aplicación, llame a las Salesforce. Por regla general, las API de REST son lo bastante sencillas para que los desarrolladores puedan acceder a ellas manualmente mediante llamadas de red rudimentarias. No obstante, no necesita hacer esto, ya que dispone de Mobile SDK para que realice las tareas tediosas por usted.
Este es un resumen de las clases que controlan las llamadas de API de REST. Todas estas clases residen en el paquete com.salesforce.androidsdk.rest.
- ClientManager. Se usa como generador de instancias de RestClient. Además, controla los inicios de sesión de cuenta y el protocolo de enlace con el servidor de Salesforce.
-
RestClient. Controla el protocolo para el envío de solicitudes de API de REST al servidor de Salesforce.
No cree instancias de RestClient directamente. En lugar de esto, llame al método ClientManager.getRestClient().
-
RestRequest. Representa solicitudes de API de REST con formato a partir de los datos que proporcione. Además, funciona como un generador de sus propias instancias.
- RestResponse: Contiene el contenido de la respuesta en el formato solicitado. La clase RestRequest crea instancias de RestResponse y las devuelve a la aplicación mediante la implementación de la interfaz RestClient.AsyncRequestCallback.
El siguiente es un diagrama animado en el que se muestra este flujo en acción.
- La aplicación llama a un método estático en la clase RestRequest para crear una instancia de RestRequest configurada.
- La aplicación pasa la nueva instancia de RestRequest y una instancia de la interfaz AsyncRequestCallback al método RestClient.sendAsync().
- Mobile SDK envía la solicitud REST presentada en el objeto RestRequest al servicio en la nube de Salesforce.
- Salesforce procesa la solicitud y devuelve una respuesta JSON a la aplicación.
- Mobile SDK empaqueta la respuesta JSON en un nuevo objeto RestResponse.
- Mobile SDK pasa el nuevo objeto RestResponse a la implementación AsyncRequestCallback de la aplicación para su consumo.
¿Sigue despierto? Vamos a ir más allá del nivel conceptual para ver esta información en acción en el mundo real de su aplicación.
Método sendRequest()
- En la ventana del proyecto de Android Studio, expanda .
- Haga doble clic en MainActivity.
- Busque el método onFetchContactsClick. Observe que este diminuto método llama al método sendRequest() con una declaración SOQL.
public void onFetchContactsClick(View v) throws UnsupportedEncodingException { sendRequest("SELECT Name FROM Contact"); }
- Haga clic con el botón derecho en “sendRequest” y, a continuación, seleccione (Ir a | Implementaciones). Ocurre que sendRequest() es un método privado en la clase MainActivity. Es estupendo que sea suyo, ya que vamos a cambiarlo más adelante.
- client. Instancia de ámbito de clase privada de RestClient. En el caso de este objeto, se crea una instancia automáticamente durante la inicialización de la aplicación.
- restRequest. Nueva instancia de RestRequest.
- RestRequest.getRequestForQuery(). Método de generador RestRequest estático que crea la instancia de RestRequest.
- AsyncRequestCallback. Implementación de la aplicación de la interfaz de devolución de llamada de respuesta REST.
Creación de la solicitud REST
RestRequest restRequest = RestRequest.getRequestForQuery( getString(R.string.api_version), soql);
Envío de la solicitud REST
client.sendAsync(restRequest, new AsyncRequestCallback() { ...
El prefijo “async” se sigue mostrando aquí. Esto debe significar algo importante. Cuando envía una solicitud de forma asíncrona, el código de la aplicación no se pausa para esperar la respuesta. Cuando llega la respuesta, Mobile SDK llama a uno de los métodos de devolución de llamada y la aplicación suspende brevemente cualquier acción para procesar la respuesta. Debe enviar las solicitudes de forma asíncrona cuando la ejecución del código tenga lugar en el subproceso principal (IU).
Captura y procesamiento de la respuesta REST
@Override public void onSuccess(RestRequest request, final RestResponse result) { result.consumeQuietly(); // consume before going back to main thread runOnUiThread(new Runnable() { @Override public void run() { try { listAdapter.clear(); JSONArray records = result.asJSONObject().getJSONArray("records"); for (int i = 0; i < records.length(); i++) { listAdapter.add( records.getJSONObject(i).getString("Name")); } } catch (Exception e) { onError(e); } } }); }
@Override public void onError(Exception exception) { runOnUiThread((new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.sf__generic_error, exception.toString()), Toast.LENGTH_LONG).show(); } }); }