Поиск…


Вступление

В этом разделе будет показано, как экспортировать записи из программы Acumatica ERP через API REST на основе контрактов. В отличие от API на основе экрана API Acumatica, API на основе контрактов предоставляет интерфейсы SOAP и REST. Для получения дополнительной информации о API на основе контракта см. Документацию Acumatica ERP

замечания

Для связи с API-интерфейсом REST на основе контракта для Acumatica ERP ваше клиентское приложение должно всегда выполнять следующие три шага:

  1. войдите в экземпляр Acumatica ERP и получите файл cookie с информацией о сеансе пользователя

  2. взаимодействовать с одной из конечных точек API на основе контракта, доступной на экземпляре Acumatica ERP

  3. выйти из Acumatica ERP, чтобы закрыть сеанс пользователя

Все образцы, представленные в этом разделе, были построены с конечной точкой по умолчанию , всегда развернутой как часть стандартного процесса установки Acumatica ERP. На экране конечных точек веб-службы (SM.20.70.60) вы можете просмотреть сведения о существующих конечных точках или настроить свои пользовательские конечные точки веб-служб на основе контракта на основе Acumatica ERP:

введите описание изображения здесь

Для вашей справки ниже приведена реализация класса RestService, используемого во всех вышеприведенных образцах, для взаимодействия с веб-службой 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;
    }
}

Экспорт данных в один звонок REST

В этом примере вы изучите, как экспортировать следующие данные из ERP Acumatica за один раз через API REST на основе контрактов:

  • все запасы, имеющиеся в заявке
  • весь порядок продаж типа IN

Если вам нужно экспортировать записи из Acumatica ERP, используйте следующий URL: http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> - это имя объекта, который вы собираетесь экспортировать

Чтобы экспортировать все элементы в одном вызове REST:

Чтобы экспортировать записи позиций запаса из локального экземпляра AcumaticaERP с использованием конечной точки по умолчанию версии 6.00.001 , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

Ниже приведен пример кода, написанного на C #, чтобы экспортировать все элементы запаса, отправив один вызов REST конечной точке по умолчанию версии 6.00.001 :

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

Чтобы экспортировать весь заказ клиента типа IN в одном вызове REST:

Чтобы экспортировать заказы на продажу типа IN из локального экземпляра AcumaticaERP с использованием конечной точки по умолчанию версии 6.00.001 , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

Ниже приведен пример кода, написанного на C #, чтобы экспортировать все заказы на продажу типа IN , отправив один вызов REST в конечную точку по умолчанию версии 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);
}

Реализация разбиения на страницы на несколько запросов REST

В этом примере вы изучите, как экспортировать следующие данные из Acumatica ERP партиями через API REST на основе контрактов:

  • запасы, имеющиеся в заявке, в партиях по 10 записей
  • все заказы на продажу в количестве 100 записей

Экспортировать товарные позиции партиями из 10 записей с несколькими вызовами REST:

Чтобы экспортировать первые 10 предметов запаса из локального экземпляра AcumaticaERP с использованием конечной точки по умолчанию версии 6.00.001 , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10

Соответственно, чтобы запросить элементы запаса с 10 до 20, вы просто увеличиваете URL-адрес выше с помощью параметра фильтра : http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem?$top=10&$filter=InventoryID gt '<InventoryID>'

<InventoryID> - это идентификатор последнего элемента запаса, экспортированного с помощью предыдущего вызова REST

Ниже приведен пример кода, написанного на C #, чтобы экспортировать все элементы запаса в партиях из 10 записей, отправив несколько вызовов REST в конечную точку по умолчанию версии 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);
    }
}

Чтобы экспортировать все заказы на продажу в количестве 100 записей с несколькими вызовами REST:

Чтобы экспортировать первые 100 заказов на продажу из локального экземпляра AcumaticaERP с использованием конечной точки по умолчанию версии 6.00.001 , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

Поскольку первичный ключ объекта заказа клиента состоит из типа заказа и номера заказа , в этом примере вы будете использовать комбинацию параметров фильтра для полей типа заказа и номера заказа :

  • чтобы запросить заказы от 100 до 200 типа SO , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> - номер последнего заказа клиента, экспортированного с помощью предыдущего вызова REST

  • соответственно, чтобы запросить первые 100 заказов на продажу следующего типа SO , вы должны использовать следующий URL: http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

Ниже приведен пример кода, написанного на C #, для экспорта всех заказов на продажу в партиях из 100 записей с несколькими вызовами REST на конечную точку по умолчанию версии 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow