RESTful Web Service Callout usando POST con Salesforce.com

Web Service Callout a servicios externos es una característica que los desarrolladores han estado solicitando desde hace un tiempo en Salesforce.com.

Utilizando la nueva anotación @future, nuestros métodos ejecutan los callout cuando Salesforce.com tiene los recursos disponibles.

Una de las grandes ventajas es que permite realizar llamadas durante las ejecuciones de triggers y code coverage

Un método de realizar llamadas es para importar WSDL y dejar a Apex hacer todo el trabajo pesado:P (WSDL2Apex). El principal problema que he encontrado es que Apex no es compatible con RPC/encoded servicesspor el momento.

APEX es compatible con HTTP Service classes que le permitirá crear servicios RESTful como una alternativa valida.

Para obtener más información y código de ejemplo, hay un gran artículo titulado Apex Web Services and Callouts..

El clase HttpResponse proporciona un ejemplo simple GET pero era difícil encontrar ejemplos usando POST, así que pensé en mostrar.

public class WebServiceCallout {

    @future (callout=true)
    public static void sendNotification(String name, String city) {

        HttpRequest req = new HttpRequest();
        HttpResponse res = new HttpResponse();
        Http http = new Http();

        req.setEndpoint('http://my-end-point.com/newCustomer');
        req.setMethod('POST');
        req.setBody('name='+EncodingUtil.urlEncode(name, 'UTF-8')+'&city='+EncodingUtil.urlEncode(city, 'UTF-8'));
        req.setCompressed(true); // otherwise we hit a limit of 32000

        try {
            res = http.send(req);
        } catch(System.CalloutException e) {
            System.debug('Callout error: '+ e);
            System.debug(res.toString());
        }

    }

    // run WebServiceCallout.testMe(); from Execute Anonymous to test
    public static testMethod void testMe() {
        WebServiceCallout.sendNotification('My Test Customer','My City');
    }

}

Tambien se pueden llamar callouts en los trigger de la siguiente manera:

trigger AccountCallout on Account (after insert) {

	for (Account a : Trigger.new) {
		// make the asynchronous web service callout
		WebServiceCallout.sendNotification(a.Name, a.BillingCity);
	}
}

Hay que tener en cuenta n par de cosas para recordar cuando se utiliza la anotación @futute:

No más de 10 llamadas al método de invocación de Apex

No más de 200 llamadas al método por licencia Salesforce en un 24 horas

Los parámetros especificados deben ser datatypes primitivos, matrices de tipos datatypes, o colecciones primitivas de datatypes

Métodos con la anotación @future no pueden tomar sObjects u otros objetos como argumentos.

Métodos con la anotación @future no puede ser usada en los controladores



Tags:
This entry was posted on Tuesday, April 13th, 2010 at 6:14 PM and is filed under Salesforce. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply

Your comment