Szukaj…


Wprowadzenie

W tym temacie zademonstrujemy, jak pobierać pliki dołączone do encji szczegółowej w programie Acumatica ERP za pomocą interfejsu API opartego na umowie.

Uwagi

Powyższy fragment kodu został utworzony przy użyciu środowiska Json.NET ( Newtonsoft.Json.dll ).

Aby uzyskać nagłówek HTTP cookie z odpowiedzi SOAP, dodaj odniesienie do .Net Framework System.ServiceModel i System.ServiceModel.Web i następujące 2, używając dyrektyw w pliku kodu:

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

Interfejs API oparty na umowie SOAP firmy Acumatica jest ograniczony, co pozwala pobierać załączniki tylko dla jednostki najwyższego poziomu. Każda próba użycia metody GetFiles () do pobrania załączników encji szczegółowej spowoduje niestety błąd „ Encja bez powiązania ekranu nie może być używana jako encja najwyższego poziomu ”, co oznacza, że można jej używać tylko z top- jednostka poziomu zdefiniowana w punkcie końcowym usługi sieci Web.

Innym ograniczeniem metody GetFiles () jest to, że zawsze zwraca ona zawartość wszystkich plików dołączonych do encji. Nie ma opcji, aby najpierw pobrać tylko nazwy plików, a następnie zdecydować, które konkretne pliki należy pobrać z programu Acumatica.

Na szczęście istnieje lepszy i bardziej kontrolowany sposób pracy z załącznikami dostarczanymi z interfejsem API REST opartym na umowie. Tablica files zwrócona jako część każdego obiektu wyeksportowanego przez oparty na umowie interfejs API REST zawiera tylko:

  • nazwy plików (właściwość filename )
  • identyfikatory plików (właściwość id )
  • odnośniki hipertekstowe (właściwość href ), które można wykorzystać później do pobrania zawartości pliku

Aby uzyskać przykład pobierania listy plików dołączonych do dowolnego elementu z punktu końcowego usługi sieci Web i pobierania określonej zawartości pliku za pośrednictwem opartego na umowie interfejsu API REST, sprawdź Pomoc produktu Acumatica

Jak można pobrać pliki dołączone do encji szczegółowej, jeśli cały projekt integracji został opracowany przy użyciu interfejsu API opartego na umowie SOAP? Jak pokazano w poniższym fragmencie kodu, możliwe jest przekazanie nagłówka pliku cookie HTTP z odpowiedzi SOAP do klienta interfejsu API REST używanego wyłącznie do pracy z załącznikami:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow