Поиск…


Вступление

В этом разделе будет показано, как загружать файлы, прикрепленные к детальному объекту внутри Acumatica ERP, используя API на основе контрактов.

замечания

Фрагмент кода выше был создан с использованием инфраструктуры Json.NET ( Newtonsoft.Json.dll ).

Чтобы получить заголовок HTTP-файла cookie из ответа SOAP, добавьте ссылку на .Net framework. Сборки System.ServiceModel и System.ServiceModel.Web и следующие 2, используя директивы в вашем файле кода:

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

В Acupatica SOAP Contract-Based API есть ограничение, позволяющее загружать вложения только для объекта верхнего уровня. Любая попытка использовать метод GetFiles () для получения вложений детализированной сущности приведет, к сожалению, к ошибке « Entity без привязки к экрану не может использоваться как объект верхнего уровня ». Говоря нам, что он может использоваться только с верхней частью, определенного в конечной точке веб-службы.

Еще одним ограничением метода GetFiles () является то, что он всегда возвращает содержимое всех файлов, прикрепленных к сущности. Невозможно сначала получить только имена файлов, а затем решить, какие файлы (ы) загрузить для Acumatica.

К счастью, существует более эффективный и управляемый способ работы с приложениями, предоставляемыми API REST на основе контракта. Массив files возвращаемый как часть каждого объекта, экспортированного API REST на основе контракта, содержит только:

  • имена файлов (свойство имени файла )
  • идентификаторы файлов (свойство id )
  • гипертекстовые ссылки (свойство href ), которые могут быть использованы позже для загрузки содержимого файла

Например, для получения списка файлов, прикрепленных к любому объекту из конечной точки веб-службы, и получения определенного содержимого файла, хотя API-интерфейс REST на основе контракта, пожалуйста, проверьте Acumatica Product Help

Как можно загружать файлы, прикрепленные к детальному объекту, если весь проект интеграции был разработан с помощью API SOAP на основе контрактов? Как показано в нижеприведенном фрагменте кода, HTTP-файл cookie HTTP можно передать из ответа SOAP в клиент REST API, который используется исключительно для работы с вложениями:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow