0

Consumir una API REST en Dynamics 365 for Finance and Operations usando RestSharp

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.

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:

[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!! :)


Contenido compartido en: jatomas.com

5

Al utilizar este sitio web aceptas las condiciones de uso y aviso legal del mismoCerrar