Ricerca…


introduzione

In questo argomento verrà illustrato come scaricare i file associati a un'entità di dettaglio in Acumatica ERP utilizzando l'API basata su contratto.

Osservazioni

Il frammento di codice sopra è stato creato utilizzando il framework Json.NET ( Newtonsoft.Json.dll ).

Per ottenere l'intestazione del cookie HTTP da una risposta SOAP, aggiungi un riferimento agli assembly .Net System.ServiceModel e System.ServiceModel.Web e alle seguenti 2 che utilizzano le direttive nel file di codice:

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

Esiste una limitazione nell'API basata su contratto SOAP di Acumatica che consente di scaricare gli allegati solo per un'entità di livello superiore. Qualsiasi tentativo di utilizzare il metodo GetFiles () per ottenere gli allegati di un'entità di dettaglio, sfortunatamente, genererà l'errore "L' entità senza associazione dello schermo non può essere utilizzata come entità di livello superiore ", dicendoci che può essere utilizzata solo con un top- entità di livello definita nell'endpoint del servizio Web.

Un'altra limitazione con il metodo GetFiles () è che restituisce sempre il contenuto di tutti i file associati a un'entità. Non è possibile recuperare prima solo i nomi dei file e quindi decidere quali file specifici da scaricare da Acumatica.

Per fortuna, c'è un modo migliore e più controllabile per lavorare con gli allegati forniti con l'API REST basata su contratto. L'array di files restituito come parte di ogni entità esportata dall'API REST basata su contratto contiene solo:

  • nomi di file (la proprietà del nome del file )
  • identificatori di file (la proprietà id )
  • riferimenti ipertestuali (la proprietà href ), che può essere utilizzata in un secondo momento per scaricare il contenuto del file

Per un esempio di ottenere un elenco di file allegati a qualsiasi entità dall'endpoint del servizio Web e recuperare il contenuto di un determinato file tramite l'API REST basata su contratto, consultare la Guida del prodotto Acumatica

In che modo è possibile scaricare i file allegati a un'entità di dettaglio se l'intero progetto di integrazione è stato sviluppato con l'API SOAP basata sul contratto di lavoro? Come mostrato nello snippet di codice seguente, è possibile passare l'intestazione del cookie HTTP da una risposta SOAP al client API REST utilizzato esclusivamente per lavorare con gli allegati:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow