Sök…


Introduktion

Det här ämnet kommer att visa hur du laddar ner filer som är kopplade till en detaljenhet i Acumatica ERP med hjälp av det Contract-Based API.

Anmärkningar

Kodavsnittet ovan skapades med Json.NET-ramverket ( Newtonsoft.Json.dll ).

För att få HTTP-cookiehuvud från ett SOAP-svar lägger du till en referens till .Net framework System.ServiceModel och System.ServiceModel.Web- enheter och följande 2 med hjälp av direktiv i din kodfil:

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

Det finns en begränsning i Acumaticas SOAP Contract-Based API som tillåter att bara ladda ner bilagor för en enhet på högsta nivå. Varje försök att använda metoden GetFiles () för att få bilagorna till en detaljenhet kommer tyvärr att resultera i felet " Enhet utan skärmbindning kan inte användas som toppnivåenhet. " Som säger att det bara kan användas med en topp- nivåenhet definierad i slutet av webbtjänsten.

En annan begränsning med metoden GetFiles () är att den alltid returnerar innehållet i alla filer som är kopplade till en enhet. Det finns inget alternativ att först hämta endast filnamn och sedan bestämma vilka fil (er) som ska laddas ner från Acumatica.

Tack och lov finns det ett bättre och mer kontrollerbart sätt att arbeta med bilagor som tillhandahålls med Contract-Based REST API. files som returneras som en del av varje enhet som exporteras av det Contract-Based REST API innehåller endast:

  • filnamn ( filnamnegenskapen )
  • filidentifierare ( ID- egenskapen)
  • hypertextreferenser ( href- egenskapen), som kan användas senare för att ladda ner filinnehåll

För ett exempel på att få en lista över filer som är kopplade till alla enheter från webbtjänstens slutpunkt och hämta speciellt filinnehåll via det kontraktbaserade REST-API, vänligen kontrollera Acumatica produkthjälp

Hur kan man ladda ner filerna som är kopplade till en detaljerad enhet om hela integrationsprojektet utvecklades med SOAP Contract-Based API? Som visas i kodavsnittet nedan är det möjligt att skicka HTTP-cookiehuvud från ett SOAP-svar till REST API-klienten som exklusivt används för att arbeta med bilagorna:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow