Zoeken…


Invoering

In dit onderwerp wordt gedemonstreerd hoe u bestanden kunt downloaden die zijn gekoppeld aan een detailentiteit binnen Acumatica ERP met behulp van de contractgebaseerde API.

Opmerkingen

Het bovenstaande codefragment is gemaakt met behulp van het Json.NET-framework ( Newtonsoft.Json.dll ).

Om een HTTP-cookiekop van een SOAP-antwoord te verkrijgen, voegt u een verwijzing naar de .Net framework System.ServiceModel- en System.ServiceModel.Web- assemblages toe en de volgende 2 met richtlijnen in uw codebestand:

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

Er is een beperking in de SOAP op contract gebaseerde API van Acumatica, waardoor bijlagen alleen voor een entiteit op het hoogste niveau kunnen worden gedownload. Elke poging om de methode GetFiles () te gebruiken om de bijlagen van een detailentiteit te krijgen, zal helaas resulteren in de fout " Entiteit zonder schermbinding kan niet worden gebruikt als entiteit op het hoogste niveau. " niveau-entiteit gedefinieerd in het webservice-eindpunt.

Een andere beperking met de methode GetFiles () is dat deze altijd de inhoud retourneert van alle bestanden die aan een entiteit zijn gekoppeld. Er is geen optie om eerst alleen bestandsnamen op te halen en vervolgens te beslissen welke specifieke bestand (en) u wilt downloaden van Acumatica.

Gelukkig is er een betere en beter beheersbare manier om te werken met bijlagen die bij de Contract-Based REST API worden geleverd. De files geretourneerd als onderdeel van elke entiteit die wordt geëxporteerd door de Contract-Based REST API bevat alleen:

  • bestandsnamen (de eigenschap bestandsnaam )
  • bestandsidentificaties (de eigenschap id )
  • hypertextverwijzingen (de eigenschap href ), die later kunnen worden gebruikt om bestandsinhoud te downloaden

Raadpleeg de Help van Acumatica voor een voorbeeld van het verkrijgen van een lijst met bestanden die zijn gekoppeld aan een entiteit vanaf het eindpunt van de webservice en het ophalen van bepaalde bestandsinhoud via de Contract-Based REST API.

Hoe kan men de bestanden downloaden die zijn gekoppeld aan een detailentiteit als het hele integratieproject is ontwikkeld met de SOAP Contract-Based API? Zoals weergegeven in het onderstaande codefragment, is het mogelijk om de HTTP-cookiekop van een SOAP-reactie door te geven aan de REST API-client die uitsluitend wordt gebruikt om met de bijlagen te werken:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow