Buscar..


Introducción

Este tema demostrará cómo exportar registros de Acumatica ERP a través de la API basada en el contrato REST. A diferencia de la API basada en pantalla de Acumatica ERP, la API basada en contrato proporciona interfaces SOAP y REST. Para obtener más información sobre la API basada en el contrato, consulte la documentación de Acumatica ERP

Observaciones

Para comunicarse con la API basada en contratos REST de Acumatica ERP, su aplicación cliente siempre debe realizar los siguientes 3 pasos:

  1. inicie sesión en la instancia de Acumatica ERP y obtenga una cookie con la información de la sesión del usuario

  2. interactúe con uno de los puntos finales API basados ​​en contrato disponibles en la instancia de Acumatica ERP

  3. cerrar sesión en Acumatica ERP para cerrar sesión de usuario

Todas las muestras proporcionadas en este tema se crearon con el punto final predeterminado , siempre implementado como parte del proceso de instalación estándar de Acumatica ERP. En la pantalla de puntos finales del servicio web (SM.20.70.60) puede ver los detalles de los puntos finales existentes o configurar sus puntos finales personalizados de los servicios web basados ​​en contratos de Acumatica ERP:

introduzca la descripción de la imagen aquí

Para su referencia, a continuación se muestra la implementación de la clase RestService utilizada en todas las muestras anteriores para interactuar con el servicio web basado en contratos de Acumatica ERP:

public class RestService : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly string _acumaticaBaseUrl;
    private readonly string _acumaticaEndpointUrl;

    public RestService(string acumaticaBaseUrl, string endpoint,
        string userName, string password,
        string company, string branch)
    {
        _acumaticaBaseUrl = acumaticaBaseUrl;
        _acumaticaEndpointUrl = _acumaticaBaseUrl + "/entity/" + endpoint + "/";
        _httpClient = new HttpClient(
            new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new CookieContainer()
            })
        {
            BaseAddress = new Uri(_acumaticaEndpointUrl),
            DefaultRequestHeaders =
            {
                Accept = {MediaTypeWithQualityHeaderValue.Parse("text/json")}
            }
        };

        var str = new StringContent(
            new JavaScriptSerializer()
                .Serialize(
                    new
                    {
                        name = userName,
                        password = password,
                        company = company,
                        branch = branch
                    }),
                    Encoding.UTF8, "application/json");

        _httpClient.PostAsync(acumaticaBaseUrl + "/entity/auth/login", str)
            .Result.EnsureSuccessStatusCode();
    }

    void IDisposable.Dispose()
    {
        _httpClient.PostAsync(_acumaticaBaseUrl + "/entity/auth/logout",
            new ByteArrayContent(new byte[0])).Wait();
        _httpClient.Dispose();
    }

    public string GetList(string entityName)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }

    public string GetList(string entityName, string parameters)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName + "?" + parameters)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }
}

Exportación de datos en una sola llamada REST

En este ejemplo, explorará cómo exportar los siguientes datos de Acumatica ERP en una sola llamada a través de la API basada en el contrato REST:

  • Todos los artículos de stock existentes en la aplicación.
  • Todo pedido de venta del tipo IN.

Si necesita exportar registros de Acumatica ERP, use la siguiente URL: http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> es el nombre de la entidad que va a exportar

Para exportar todos los artículos en stock en una sola llamada REST:

Para exportar registros de artículos de stock desde una instancia local de AcumaticaERP utilizando el punto final predeterminado de la versión 6.00.001 , debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

A continuación se muestra el código de muestra escrito en C # para exportar todos los artículos en stock enviando una sola llamada REST al punto final predeterminado de la versión 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/AcumaticaERP/", "Default/6.00.001",
    username, password, company, branch))
{
    string stockItems = rs.GetList("StockItem");
}

Para exportar todos los pedidos de venta del tipo IN en una sola llamada REST:

Para exportar pedidos de venta del tipo IN desde una instancia local de AcumaticaERP utilizando el punto final predeterminado de la versión 6.00.001 , debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

A continuación se muestra el código de muestra escrito en C # para exportar todos los pedidos de venta del tipo IN enviando una sola llamada REST al punto final predeterminado de la versión 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var parameters = "$filter=OrderType eq 'IN'";
    string inSalesOrders = rs.GetList("SalesOrder", parameters);
}

Implementación de paginación en múltiples solicitudes REST

En este ejemplo, explorará cómo exportar los siguientes datos de Acumatica ERP en lotes a través de la API basada en el contrato REST:

  • Stock de artículos existentes en la aplicación en lotes de 10 registros.
  • Todas las órdenes de venta en lotes de 100 registros.

Para exportar artículos en stock en lotes de 10 registros con múltiples llamadas REST:

Para exportar los primeros 10 artículos en stock de una instancia local de AcumaticaERP utilizando el punto final predeterminado de la versión 6.00.001 , debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10

En consecuencia, para solicitar artículos de 10 a 20, simplemente extienda la URL anterior con el parámetro de filtro : http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>'

<InventoryID> es el ID del último artículo de stock exportado con una llamada REST anterior

A continuación se muestra el código de muestra escrito en C # para exportar todos los artículos en stock en lotes de 10 registros mediante el envío de varias llamadas REST al punto final predeterminado de la versión 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=10";
    string items = rs.GetList("StockItem", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    while (records.Count == 10)
    {
        var inventoryID = records[records.Count - 1]["InventoryID"] as Dictionary<string, object>;
        var inventoryIDValue = inventoryID.Values.First();
        string nextParameters = parameters + "&" + 
            "$filter=" + string.Format("InventoryID gt '{0}'", inventoryIDValue);
        items = rs.GetList("StockItem", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
    }
}

Para exportar todos los pedidos de ventas en lotes de 100 registros con múltiples llamadas REST:

Para exportar las primeras 100 órdenes de venta desde una instancia local de AcumaticaERP utilizando el punto final predeterminado de la versión 6.00.001 , debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

Dado que la clave principal de la entidad Pedido de venta está compuesta por el Tipo de pedido y el Número de pedido , en este ejemplo, utilizará una combinación de parámetros de filtro para los campos Tipo de pedido y Número de pedido :

  • para solicitar pedidos de ventas de 100 a 200 del tipo SO , debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> es el número del último pedido de venta exportado con una llamada REST anterior

  • en consecuencia, para solicitar las primeras 100 órdenes de venta del tipo SO próximo, debe usar la siguiente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

A continuación se muestra el código de muestra escrito en C # para exportar todos los pedidos de ventas en lotes de 100 registros con múltiples llamadas REST al punto final predeterminado de la versión 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=100";
    string items = rs.GetList("SalesOrder", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    bool sameOrderType = true;
    while (records.Count > 0 && (records.Count == 100 || !sameOrderType))
    {
        var orderType = records[records.Count - 1]["OrderType"] as Dictionary<string, object>;
        var orderTypeValue = orderType.Values.First();
        var orderNbr = records[records.Count - 1]["OrderNbr"] as Dictionary<string, object>;
        var orderNbrValue = orderNbr.Values.First();

        string nextParameters = parameters + "&" + "$filter=" +
            string.Format("OrderType {0} '{1}'", sameOrderType ? "eq" : "gt", orderTypeValue) + " and " +
            string.Format("OrderNbr gt '{0}'", sameOrderType ? orderNbrValue : "''" );
        items = rs.GetList("SalesOrder", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
        sameOrderType = records.Count == 100;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow