En uno de nuestros últimos proyectos implantando #MSDyn365FO nos ha surgido la necesidad de consumir un API REST para realizar una serie de integraciones entre el ERP y aplicaciones externas. En esta ocasión nos hemos apoyado en RestSharp para ello.
RestSharp es un cliente HTTP completo de código abierto que funciona con todas las tecnologías .net, y como todos sabéis, X++ ya está incluido dentro del stack .net (oh yeah!). RestSharp nos va a permitir acceder rápidamente a los datos requeridos sin la complejidad de manejar peticiones HTTP sin procesar.
Ahora, si os parece, vamos a ver como podemos utilizar esta librería en nuestro sistema. Para ello, lo primero que haremos es descargarnos el paquete de NuGet desde el cual podemos extraer la dll para utlizarla en nuestro sistema.
Una vez que tenemos la dll disponible pasaremos a agregarlo como referencia dentro de nuestro proyecto para poder utilizarlo, y hay que tener en cuenta que necesitamos transferir esta dll entre los distintos entornos (UAT, pre-producción, producción…), y puesto que nos encontramos en un entorno Cloud sobre el que no tenemos acceso a los entornos productivos, la mejor manera de hacerlo es la siguiente:
- Añadimos la dll a la carpeta Bin del paquete en el que vayamos a escribir nuestro código.
- Para poder mover el archivo entre los distintos entornos y que pueda ser utilizado en todos ellos, lo añadiremos a nuestro repositorio de código Azure DevOps desde el Source Control Explorer, de esta forma, cuando generemos un Deployable Package, este incluirá la dll y será desplegada entre los distintos entornos a través de LCS. La forma de conseguir esto, es en el Source Control Explorer, botón derecho sobre la carpeta bin de nuestro paquete, Add items to folder. Seleccionamos la dll y finalizamos.
- Ahora solo nos queda añadir la referencia a Visual Studio y utilizarlo. Para ello, vamos a nuestra solución en Visual Studio, y sobre el nodo References, hacemos click con el botón derecho, Add reference, y seleccionamos la dll que tenemos en nuestra carpeta bin.
- Por último, creamos una clase que se encargará de ejecutar las llamadas http, añadiendo en ellas, a través de directivas using, las librerías RestSharp para manejar las peticiones, y NewtonSoft para gestionar las respuestas en formato json de forma sencilla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
using RestSharp; using Newtonsoft.Json; class JATConsumeRestApi { public static void main(Args _args) { // Creamos el cliente http RestClient restClient = new RestClient("endpointUrl"); RestRequest restRequest = new RestRequest(Method::POST); // Añadimos los distintos parámetros necesarios en el header restRequest.AddHeader("authorization", "XXX Bearer token XXX"); restRequest.AddHeader("x-api-key", "XXX api key XXX"); restRequest.AddHeader("Content-Type", "application/json"); // Añadimos los parámetros necesarios en el body restRequest.AddParameter("date", date2Str(_transDate, 321, 2, DateSeparator::Hyphen, 2, DateSeparator::Hyphen, 4)); // Ejecutamos la llamada IRestResponse response = restClient.Execute(restRequest); if (response.StatusCode == System.Net.HttpStatusCode::OK) { // Deserializamos el JSON recibido insertando los datos en nuestro DataContract JATResponseDC responseDC = FormJsonSerializer::deserializeObject(className2Id(classStr(JATResponseDC)), response.Content); /* ... Your logic here ... */ } else { throw error(strFmt("%1 : %3", funcName(), response.StatusDescription)); } } } |
Nota: Para poder realizar la deserialización del objeto recibido sin ningún problema, lo más importante es que los DataMembers del contrato de datos tengan exáctamente el mismo nombre que el Json que recibimos como respuesta, tal y como podéis ver en el siguiente ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[DataContract] class JATResponseDC { /* JSON Received { "numero_factura":"FV001", "fecha_transaccion":"2018-05-10" } */ InvoiceId invoiceId; TransDate transDate; [DataMember("numero_factura")] public InvoiceId parmInvoiceId(InvoiceId _invoiceId = invoiceId) { invoiceId = _invoiceId; return invoiceId; } [DataMember("fecha_transaccion")] public TransDate parmTransDate(TransDate _transDate = transDate) { transDate = _transDate; return transDate; } } |
En conclusión, la utilización de una librería como RestSharp hace que el consumo de APIs REST, o de llamadas Http resulten realmente sencillas, de forma que podemos centrarnos, como siempre, en la gestión de los datos. Como siempre, espero que os resulte útil, porque para mi lo ha sido. Cualquier cosa, os leo en los comentarios, hasta la próxima!! 🙂
Buenas tardes, estoy interesado en consumir una api de dynamic 365 por lotes o batch-
No puede bajar la dll de RestSharp baje lo que esta en GitHub pero no lo encontre.
SI me la puedes brindar te agradezco
Saludos
Hola Juan Ramón, primero, agradecerte que te pases por mi blog y comentes.
Si no me equivoco, deberías ser capaz de descargarte el Nuget package (nupkg) desde el enlace que hay en el artículo. Posteriormente, puedes convertirlo en un zip (cambiar la extensión a .zip), y podrás extraer de ahí la dll. La versión compatible con X++ será la que encuentres en lib/net471/RestSharp.dll
Un saludo.