Recherche…


Introduction

Cette rubrique explique comment télécharger des fichiers joints à une entité de détail dans Acumatica ERP à l'aide de l'API Contract-Based.

Remarques

L'extrait de code ci-dessus a été créé à l'aide du framework Json.NET ( Newtonsoft.Json.dll ).

Pour obtenir un en-tête de cookie HTTP à partir d'une réponse SOAP, ajoutez une référence aux assemblys System.ServiceModel et System.ServiceModel.Web de .Net Framework et aux 2 suivants à l'aide des directives de votre fichier de code:

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

Il existe une limitation dans l'API basée sur le contrat SOAP d'Acumatica, qui permet de télécharger des pièces jointes uniquement pour une entité de premier niveau. Toute tentative d'utilisation de la méthode GetFiles () pour récupérer les pièces jointes d'une entité de détail entraînera malheureusement l'erreur "L' entité sans liaison d'écran ne peut pas être utilisée comme entité de premier niveau. " entité de niveau définie dans le noeud final du service Web.

Une autre limitation de la méthode GetFiles () est qu’elle renvoie toujours le contenu de tous les fichiers attachés à une entité. Il n’ya pas d’option pour récupérer d’abord uniquement les noms de fichiers, puis décider quels fichiers particuliers télécharger sur Acumatica.

Heureusement, il existe un moyen plus efficace de contrôler les pièces jointes fournies avec l’API REST basée sur contrat. Le tableau de files renvoyé dans le cadre de chaque entité exportée par l'API REST basée sur le contrat contient uniquement:

  • noms de fichiers (la propriété filename )
  • identificateurs de fichier (la propriété id )
  • références hypertextes (la propriété href ), utilisables ultérieurement pour télécharger le contenu du fichier

Pour obtenir un exemple d'obtention d'une liste de fichiers attachés à une entité à partir du point de terminaison du service Web et pour récupérer du contenu de fichier particulier via l'API REST basée sur contrat, consultez l' Aide du produit Acumatica.

Comment peut-on télécharger les fichiers attachés à une entité détaillée si l'intégralité du projet d'intégration a été développé avec l'API SOAP Contract-Based? Comme illustré dans l'extrait de code ci-dessous, il est possible de transmettre l'en-tête de cookie HTTP à partir d'une réponse SOAP au client API REST utilisé exclusivement pour travailler avec les pièces jointes:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow