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: Salesforce







