Buscar..


Introducción

Este tema mostrará cómo descargar archivos adjuntos a una entidad de detalle dentro de Acumatica ERP mediante el uso de la API basada en contratos.

Observaciones

El fragmento de código anterior se creó utilizando el marco Json.NET ( Newtonsoft.Json.dll ).

Para obtener el encabezado de la cookie HTTP a partir de una respuesta SOAP, agregue una referencia a los ensamblados .Net Framework System.ServiceModel y System.ServiceModel.Web y los siguientes 2 usando directivas en su archivo de código:

using System.ServiceModel;
using System.ServiceModel.Web;

Existe una limitación en la API basada en contrato SOAP de Acumatica que permite descargar archivos adjuntos solo para una entidad de nivel superior. Desafortunadamente, cualquier intento de usar el método GetFiles () para obtener los adjuntos de una entidad detallada dará como resultado el error "La entidad sin enlace de pantalla no se puede usar como entidad de nivel superior " . Nos dice que solo se puede usar con un top Entidad de nivel definida en el punto final del servicio web.

Otra limitación con el método GetFiles () es que siempre devuelve el contenido de todos los archivos adjuntos a una entidad. No hay opción de recuperar primero solo los nombres de archivos y luego decidir qué archivos en particular se descargarán de Acumatica.

Afortunadamente, existe una forma mejor y más controlable de trabajar con los archivos adjuntos que se proporcionan con la API REST basada en el contrato. La matriz de files devuelta como parte de cada entidad exportada por la API REST basada en contrato solo contiene:

  • nombres de archivos (la propiedad de nombre de archivo )
  • identificadores de archivo (la propiedad id )
  • Referencias de hipertexto (la propiedad href ), que pueden usarse más adelante para descargar el contenido del archivo

Para obtener un ejemplo de cómo obtener una lista de archivos adjuntos a cualquier entidad desde el punto final del servicio web y recuperar el contenido de un archivo en particular a través de la API REST basada en el contrato, consulte la Ayuda del producto Acumatica

¿Cómo se pueden descargar los archivos adjuntos a una entidad de detalle si el proyecto de integración completo se desarrolló con la API basada en contrato SOAP? Como se muestra en el fragmento de código a continuación, es posible pasar el encabezado de la cookie HTTP desde una respuesta SOAP al cliente de la API REST que se utiliza exclusivamente para trabajar con los archivos adjuntos:

using (var soapClient = new DefaultSoapClient())
{
    var address = new Uri("http://localhost/AcumaticaERP/entity/Default/6.00.001/");
    CookieContainer cookieContainer;
    using (new OperationContextScope(soapClient.InnerChannel))
    {
        soapClient.Login(login, password, null, null, null);
        string sharedCookie = WebOperationContext.Current.IncomingResponse.Headers["Set-Cookie"];
        cookieContainer = new CookieContainer();
        cookieContainer.SetCookies(address, sharedCookie);
    }
    try
    {
        var shipment = new Shipment()
        {
            ShipmentNbr = new StringSearch { Value = "001301" },
            ReturnBehavior = ReturnBehavior.OnlySpecified
        };
        shipment = soapClient.Get(shipment) as Shipment;

        var restClient = new HttpClient(
            new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = cookieContainer
            });
        restClient.BaseAddress = address;// new Uri("http://localhost/059678/entity/Default/6.00.001/");

        var res = restClient.GetAsync("Shipment/" + shipment.ID + "?$expand=Packages")
            .Result.EnsureSuccessStatusCode();
        var shipmentWithPackages = res.Content.ReadAsStringAsync().Result;

        JObject jShipment = JObject.Parse(shipmentWithPackages);
        JArray jPackages = jShipment.Value<JArray>("Packages");
        foreach (var jPackage in jPackages)
        {
            JArray jFiles = jPackage.Value<JArray>("files");
            string outputDirectory = ".\\Output\\";
            if (!Directory.Exists(outputDirectory))
            {
                Directory.CreateDirectory(outputDirectory);
            }

            foreach (var jFile in jFiles)
            {
                string fullFileName = jFile.Value<string>("filename");
                string fileName = Path.GetFileName(fullFileName);
                string href = jFile.Value<string>("href");

                res = restClient.GetAsync(href).Result.EnsureSuccessStatusCode();
                byte[] file = res.Content.ReadAsByteArrayAsync().Result;
                System.IO.File.WriteAllBytes(outputDirectory + fileName, file);
            }
        }
    }
    finally
    {
        soapClient.Logout();
    }
}


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