Szukaj…


Wprowadzenie

W tym temacie zademonstrujemy, jak eksportować rekordy z Acumatica ERP za pośrednictwem interfejsu API opartego na umowie REST. W przeciwieństwie do interfejsu API opartego na ekranie Acumatica ERP, interfejs oparty na kontraktach zapewnia zarówno interfejsy SOAP, jak i REST. Aby uzyskać więcej informacji na temat interfejsu API opartego na umowie, zobacz dokumentację Acumatica ERP

Uwagi

Aby komunikować się z opartym na kontraktach interfejsem API Acumatica ERP, aplikacja kliencka musi zawsze wykonywać następujące 3 kroki:

  1. zaloguj się do instancji Acumatica ERP i uzyskaj plik cookie z informacjami o sesji użytkownika

  2. współdziałać z jednym z punktów końcowych interfejsu API opartych na umowie dostępnych w instancji Acumatica ERP

  3. wyloguj się z Acumatica ERP, aby zamknąć sesję użytkownika

Wszystkie próbki przedstawione w tym temacie zostały zbudowane z domyślnym punktem końcowym, zawsze wdrażanym jako część standardowego procesu instalacji ERP Acumatica. Na ekranie Punktów końcowych usług sieciowych (SM.20.70.60) można wyświetlić szczegóły istniejących punktów końcowych lub skonfigurować niestandardowe punkty końcowe usług internetowych opartych na kontraktach Acumatica ERP:

wprowadź opis zdjęcia tutaj

W celach informacyjnych poniżej przedstawiono implementację klasy RestService używanej we wszystkich powyższych przykładach do interakcji z opartą na umowie usługą internetową 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;
    }
}

Eksport danych w jednym wywołaniu REST

W tym przykładzie poznasz, jak wyeksportować następujące dane z Acumatica ERP w jednym wywołaniu za pośrednictwem opartego na umowie interfejsu API REST:

  • wszystkie elementy magazynowe istniejące w aplikacji
  • wszystkie zamówienia sprzedaży typu IN

Jeśli chcesz wyeksportować rekordy z Acumatica ERP, użyj następującego adresu URL: http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> to nazwa jednostki, którą zamierzasz wyeksportować

Aby wyeksportować wszystkie zapasy w jednym wywołaniu REST:

Aby wyeksportować rekordy pozycji magazynowych z lokalnej instancji AcumaticaERP przy użyciu domyślnego punktu końcowego wersji 6.00.001 , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

Poniżej znajduje się przykładowy kod napisany w języku C # w celu wyeksportowania wszystkich pozycji magazynowych poprzez wysłanie pojedynczego wywołania REST do domyślnego punktu końcowego wersji 6.00.001 :

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

Aby wyeksportować całe zamówienie sprzedaży typu IN w jednym wywołaniu REST:

Aby wyeksportować zamówienia sprzedaży typu IN z lokalnej instancji AcumaticaERP przy użyciu domyślnego punktu końcowego wersji 6.00.001 , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

Poniżej znajduje się przykładowy kod napisany w języku C #, aby wyeksportować wszystkie zamówienia sprzedaży typu IN , wysyłając pojedyncze wywołanie REST do domyślnego punktu końcowego wersji 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);
}

Wdrażanie paginacji wielu żądań REST

W tym przykładzie poznasz sposób eksportowania następujących danych z Acumatica ERP partiami za pośrednictwem opartego na umowie interfejsu API REST:

  • elementy zapasów istniejące w aplikacji w partiach po 10 rekordów
  • wszystkie zamówienia sprzedaży w partiach po 100 rekordów

Aby wyeksportować towary magazynowe w partiach po 10 rekordów z wieloma wywołaniami REST:

Aby wyeksportować pierwsze 10 towarów z lokalnej instancji AcumaticaERP przy użyciu domyślnego punktu końcowego wersji 6.00.001 , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10

W związku z tym, aby zamówić artykuły magazynowe od 10 do 20, wystarczy rozszerzyć powyższy adres URL o parametr filtru : http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>'

<InventoryID> to identyfikator ostatniej pozycji towaru wyeksportowanej z poprzednim wywołaniem REST

Poniżej znajduje się przykładowy kod napisany w języku C # w celu wyeksportowania wszystkich pozycji magazynowych w partiach po 10 rekordów poprzez wysłanie wielu wywołań REST do domyślnego punktu końcowego wersji 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);
    }
}

Aby wyeksportować wszystkie zamówienia sprzedaży w partiach po 100 rekordów z wieloma wywołaniami REST:

Aby wyeksportować pierwsze 100 zamówień sprzedaży z lokalnej instancji AcumaticaERP przy użyciu domyślnego punktu końcowego wersji 6.00.001 , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

Ponieważ klucz podstawowy encji Zamówienie sprzedaży składa się z typu zamówienia i numeru zamówienia , w tym przykładzie użyjesz kombinacji parametrów filtrów dla pól Typ zamówienia i Numer zamówienia :

  • aby zażądać zamówień sprzedaży od 100 do 200 typu SO , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> to numer ostatniego zamówienia eksportowego wyeksportowanego z poprzednim wywołaniem REST

  • odpowiednio, aby zażądać pierwszych 100 zamówień sprzedaży typu SO , należy użyć następującego adresu URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

Poniżej znajduje się przykładowy kod napisany w języku C # w celu wyeksportowania wszystkich zamówień sprzedaży w partiach po 100 rekordów z wieloma wywołaniami REST do domyślnego punktu końcowego wersji 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow