acumatica
Загрузка файлов, привязанных к детальному объекту с использованием API на основе контрактов
Поиск…
Вступление
В этом разделе будет показано, как загружать файлы, прикрепленные к детальному объекту внутри 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;
Заголовок HTTP Cookie из ответа SOAP, совместно используемого клиентами SOAP и REST
В 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();
}
}