Ricerca…


introduzione

Questo argomento mostrerà come esportare i record da Acumatica ERP tramite l'API basata sul contratto REST. A differenza dell'API basata su schermo di Acumatica ERP, l'API basata su contratto fornisce sia interfacce SOAP che REST. Per ulteriori informazioni sull'API basata su contratto, vedere Documentazione ERP di Acumatica

Osservazioni

Per comunicare con l'API REST basata su REST di Acumatica ERP, l'applicazione client deve sempre eseguire i seguenti 3 passaggi:

  1. accedere all'istanza di Acumatica ERP e ottenere cookie con le informazioni sulla sessione utente

  2. interagire con uno degli endpoint API basati su contratto disponibili sull'istanza di Acumatica ERP

  3. disconnettersi da Acumatica ERP per chiudere la sessione utente

Tutti gli esempi forniti in questo argomento sono stati creati con l'endpoint predefinito , sempre implementato come parte del processo di installazione standard di Acumatica ERP. Nella schermata degli endpoint del servizio Web (SM.20.70.60) è possibile visualizzare i dettagli degli endpoint esistenti o configurare gli endpoint personalizzati dei servizi Web basati su contratto ACP di Acumatica:

inserisci la descrizione dell'immagine qui

Di seguito, l'implementazione della classe RestService utilizzata in tutti gli esempi precedenti per interagire con il servizio Web basato su contratto di Acumatica ERP:

public class RestService : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly string _acumaticaBaseUrl;
    private readonly string _acumaticaEndpointUrl;

    public RestService(string acumaticaBaseUrl, string endpoint,
        string userName, string password,
        string company, string branch)
    {
        _acumaticaBaseUrl = acumaticaBaseUrl;
        _acumaticaEndpointUrl = _acumaticaBaseUrl + "/entity/" + endpoint + "/";
        _httpClient = new HttpClient(
            new HttpClientHandler
            {
                UseCookies = true,
                CookieContainer = new CookieContainer()
            })
        {
            BaseAddress = new Uri(_acumaticaEndpointUrl),
            DefaultRequestHeaders =
            {
                Accept = {MediaTypeWithQualityHeaderValue.Parse("text/json")}
            }
        };

        var str = new StringContent(
            new JavaScriptSerializer()
                .Serialize(
                    new
                    {
                        name = userName,
                        password = password,
                        company = company,
                        branch = branch
                    }),
                    Encoding.UTF8, "application/json");

        _httpClient.PostAsync(acumaticaBaseUrl + "/entity/auth/login", str)
            .Result.EnsureSuccessStatusCode();
    }

    void IDisposable.Dispose()
    {
        _httpClient.PostAsync(_acumaticaBaseUrl + "/entity/auth/logout",
            new ByteArrayContent(new byte[0])).Wait();
        _httpClient.Dispose();
    }

    public string GetList(string entityName)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }

    public string GetList(string entityName, string parameters)
    {
        var res = _httpClient.GetAsync(_acumaticaEndpointUrl + entityName + "?" + parameters)
            .Result.EnsureSuccessStatusCode();

        return res.Content.ReadAsStringAsync().Result;
    }
}

Esportazione dati in una singola chiamata REST

In questo esempio, esplorerai come esportare i seguenti dati da Acumatica ERP in una singola chiamata tramite l'API basata sul contratto REST:

  • tutti gli articoli di magazzino esistenti nell'applicazione
  • tutto l'ordine di vendita del tipo IN

Se è necessario esportare i record da Acumatica ERP, utilizzare il seguente URL: http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> è il nome dell'entità che si intende esportare

Per esportare tutti gli articoli in stock in un'unica chiamata REST:

Per esportare i record degli articoli stock da un'istanza AcumaticaERP locale utilizzando l'endpoint predefinito della versione 6.00.001 , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

Di seguito è riportato il codice di esempio scritto in C # per esportare tutti gli articoli stock inviando una singola chiamata REST all'endpoint predefinito della versione 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/AcumaticaERP/", "Default/6.00.001",
    username, password, company, branch))
{
    string stockItems = rs.GetList("StockItem");
}

Per esportare tutto l'ordine di vendita del tipo IN in una singola chiamata REST:

Per esportare ordini di vendita del tipo IN da un'istanza AcumaticaERP locale utilizzando l'endpoint predefinito della versione 6.00.001 , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

Di seguito è riportato il codice di esempio scritto in C # per esportare tutti gli ordini di vendita del tipo IN inviando una singola chiamata REST all'endpoint predefinito della versione 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var parameters = "$filter=OrderType eq 'IN'";
    string inSalesOrders = rs.GetList("SalesOrder", parameters);
}

Implementazione dell'impaginazione su più richieste REST

In questo esempio, esplorerai come esportare i seguenti dati da Acumatica ERP in batch tramite l'API basata sul contratto REST:

  • articoli di magazzino esistenti nell'applicazione in lotti di 10 record
  • tutti gli ordini di vendita in lotti di 100 record

Per esportare articoli in lotti di 10 record con più chiamate REST:

Per esportare i primi 10 articoli stock da un'istanza AcumaticaERP locale utilizzando l'endpoint predefinito della versione 6.00.001 , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10

Di conseguenza, per richiedere articoli in stock da 10 a 20, devi semplicemente estendere l'URL sopra con il parametro filter : http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>'

<InventoryID> è l'ID dell'ultimo elemento stock esportato con una precedente chiamata REST

Di seguito è riportato il codice di esempio scritto in C # per esportare tutti gli articoli in lotti di 10 record inviando più chiamate REST all'endpoint predefinito della versione 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=10";
    string items = rs.GetList("StockItem", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    while (records.Count == 10)
    {
        var inventoryID = records[records.Count - 1]["InventoryID"] as Dictionary<string, object>;
        var inventoryIDValue = inventoryID.Values.First();
        string nextParameters = parameters + "&" + 
            "$filter=" + string.Format("InventoryID gt '{0}'", inventoryIDValue);
        items = rs.GetList("StockItem", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
    }
}

Per esportare tutti gli ordini di vendita in gruppi di 100 record con più chiamate REST:

Per esportare i primi 100 ordini di vendita da un'istanza AcumaticaERP locale utilizzando l'endpoint predefinito della versione 6.00.001 , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

Poiché la chiave primaria dell'entità Ordine di vendita è composta dal Tipo ordine e dal Numero ordine , in questo esempio verrà utilizzata una combinazione di parametri filtro per i campi Tipo ordine e Numero ordine :

  • per richiedere ordini di vendita da 100 a 200 del tipo SO , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> è il numero dell'ultimo ordine di vendita esportato con una precedente chiamata REST

  • di conseguenza, per richiedere i primi 100 ordini di vendita del prossimo tipo SO , è necessario utilizzare il seguente URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

Di seguito è riportato il codice di esempio scritto in C # per esportare tutti gli ordini di vendita in batch di 100 record con più chiamate REST all'endpoint predefinito della versione 6.00.001 :

using (RestService rs = new RestService(
    @"http://localhost/StackOverflow/", "Default/6.00.001",
    username, password, company, branch))
{
    var json = new JavaScriptSerializer();
    string parameters = "$top=100";
    string items = rs.GetList("SalesOrder", parameters);
    var records = json.Deserialize<List<Dictionary<string, object>>>(items);

    bool sameOrderType = true;
    while (records.Count > 0 && (records.Count == 100 || !sameOrderType))
    {
        var orderType = records[records.Count - 1]["OrderType"] as Dictionary<string, object>;
        var orderTypeValue = orderType.Values.First();
        var orderNbr = records[records.Count - 1]["OrderNbr"] as Dictionary<string, object>;
        var orderNbrValue = orderNbr.Values.First();

        string nextParameters = parameters + "&" + "$filter=" +
            string.Format("OrderType {0} '{1}'", sameOrderType ? "eq" : "gt", orderTypeValue) + " and " +
            string.Format("OrderNbr gt '{0}'", sameOrderType ? orderNbrValue : "''" );
        items = rs.GetList("SalesOrder", nextParameters);
        records = json.Deserialize<List<Dictionary<string, object>>>(items);
        sameOrderType = records.Count == 100;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow