acumatica
契約ベースのAPIを使用して詳細エンティティに添付されたファイルをダウンロードする
サーチ…
前書き
このトピックでは、Contract-Based APIを使用してAcumatica ERP内の詳細エンティティに添付されたファイルをダウンロードする方法を説明します。
備考
上記のコードスニペットは、 Json.NETフレームワーク ( Newtonsoft.Json.dll )を使用して作成されました。
SOAP応答からHTTP Cookieヘッダーを取得するには、.NetフレームワークのSystem.ServiceModelおよびSystem.ServiceModel.Webアセンブリへの参照を追加し、コードファイルで以下の2つのディレクティブを使用します。
using System.ServiceModel;
using System.ServiceModel.Web;
SOAPおよびRESTクライアントによって共有されるSOAP応答からのHTTP Cookieヘッダー
AcumaticaのSOAP Contract-Based APIには、トップレベルエンティティの添付ファイルのみをダウンロードできるという制限があります。 GetFiles()メソッドを使用して詳細エンティティの添付ファイルを取得しようとすると、残念ながら「 エンティティが画面バインドなしでは最上位エンティティとして使用できません 」というエラーが発生します。 Webサービスエンドポイントで定義されたレベルエンティティ。
GetFiles()メソッドのもう1つの制限は、エンティティにアタッチされているすべてのファイルの内容を常に返します。最初にファイル名のみを取得し、Acumaticaからダウンロードする特定のファイルを決定するオプションはありません。
ありがたいことに、コントラクトベースのREST APIで提供される添付ファイルを使用する方が、より優れた制御可能な方法があります。 Contract-Based REST APIによってエクスポートされたすべてのエンティティの一部として返されるfiles
配列には、次のもののみが含まれます。
- ファイル名( filenameプロパティ)
- ファイル識別子( idプロパティ)
- 後でファイルコンテンツをダウンロードするために使用できるハイパーテキストリファレンス( hrefプロパティ)
Webサービスエンドポイントからエンティティに接続されたファイルのリストを取得し、Contract-Based REST APIを使用して特定のファイルコンテンツを取得する例については、 Acumatica Product Help
統合プロジェクト全体がSOAP Contract-Based APIで開発された場合、どのように詳細エンティティに添付されたファイルをダウンロードできますか?以下のコードスニペットに示すように、SOAPレスポンスのHTTP Cookieヘッダーを、添付ファイルの操作専用の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();
}
}