수색…


소개

이 항목에서는 Rum Contract-Based API를 통해 Acumatica ERP에서 레코드를 내보내는 방법을 보여줍니다. Acumatica ERP의 스크린 기반 API와 달리 계약 기반 API는 SOAP 및 REST 인터페이스를 모두 제공합니다. Contract-Based API에 대한 자세한 내용은 Acumatica ERP Documentation을 참조하십시오.

비고

Acumatica ERP의 REST Contract-Based API와 통신하려면 클라이언트 애플리케이션이 항상 다음 세 단계를 수행해야합니다.

  1. Acumatica ERP 인스턴스에 로그인하여 사용자 세션 정보로 쿠키 가져 오기

  2. Acumatica ERP 인스턴스에서 사용 가능한 계약 기반 API 엔드 포인트 중 하나와 상호 작용합니다.

  3. Acumatica ERP에서 로그 아웃하여 사용자 세션 닫기

이 항목에서 제공되는 모든 샘플은 표준 Acumatica ERP 설치 프로세스의 일부로 항상 배포되는 기본 끝점을 사용하여 작성되었습니다. 웹 서비스 끝점 화면 (SM.20.70.60)에서 기존 끝점의 세부 정보를 보거나 Acumatica ERP 계약 기반 웹 서비스의 사용자 지정 끝점을 구성 할 수 있습니다.

여기에 이미지 설명을 입력하십시오.

참조 용으로, 아래의 모든 샘플에서 Acumatica ERP의 계약 기반 웹 서비스와 상호 작용하는 RestService 클래스 구현이 있습니다.

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 호출로 데이터 내보내기

이 예에서는 REST 계약 기반 API를 통해 단일 호출로 Acumatica ERP에서 다음 데이터를 내보내는 방법을 살펴 봅니다.

  • 신청서에있는 모든 재고 품목
  • IN 유형의 모든 판매 오더

Acumatica ERP에서 레코드를 내보내려면 http://<Acumatica ERP instance URL>/entity/<Endpoint name>/<Endpoint version>/<Top-level entity>

<Top-level entity> 는 내보낼 엔티티의 이름입니다.

단일 REST 호출로 모든 재고 항목을 내보내려면 다음을 수행하십시오.

버전 6.00.001기본 끝점을 사용하여 로컬 AcumaticaERP 인스턴스에서 재고 항목 레코드를 내보내려면 다음 URL을 사용해야합니다. http://localhost/AcumaticaERP/entity/Default/6.00.001/StockItem

다음은 버전 6.00.001기본 끝점에 단일 REST 호출을 보내 모든 주식 항목을 내보내는 C #으로 작성된 샘플 코드입니다.

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

단일 REST 호출로 IN 유형의 모든 판매 주문을 내보내려면 다음을 수행하십시오.

버전 6.00.001기본 끝점을 사용하여 로컬 AcumaticaERP 인스턴스에서 IN 유형의 판매 주문을 내보내려면 다음 URL을 사용해야합니다. http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$filter=OrderType eq 'IN'

아래는 C #으로 작성된 샘플 코드로, 단일 REST 호출을 버전 6.00.001기본 엔드 포인트로 전송하여 IN 유형의 모든 판매 주문을 내보내는 예제입니다 .

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 요청에 대한 페이지 매김 구현

이 예제에서는 Rum Contract-Based API를 통해 Acumatica ERP에서 다음 데이터를 일괄 적으로 내보내는 방법을 살펴 봅니다.

  • 10 레코드의 배치로 응용 프로그램에 존재하는 재고 항목
  • 100 개 레코드의 모든 판매 주문

여러 개의 REST 호출로 재고 항목을 일괄 적으로 10 개의 레코드로 내보내려면

버전 6.00.001기본 끝점을 사용하여 로컬 AcumaticaERP 인스턴스에서 처음 10 개의 재고 항목을 내보내려면 다음 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 호출로 반출 된 마지막 재고 항목의 ID입니다.

다음은 버전 6.00.001기본 끝점으로 여러 REST 호출을 보내 10 개의 레코드 일괄 처리로 모든 재고 항목을 내보내는 C #으로 작성된 샘플 코드입니다.

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);
    }
}

여러 REST 호출로 100 개의 레코드 일괄 처리로 모든 판매 주문을 내보내려면

버전 6.00.001기본 끝점을 사용하여 로컬 AcumaticaERP 인스턴스에서 처음 100 개의 판매 주문을 내보내려면 다음 URL을 사용해야합니다. http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100

판매 주문 엔티티의 기본 키가 주문 유형주문 번호 로 구성되기 때문에이 예제에서는 주문 유형주문 번호 필드에 대한 필터 매개 변수의 조합을 사용하게됩니다.

  • SO 유형의 100에서 200까지 판매 주문을 요청하려면 다음 URL을 사용해야합니다. http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType eq 'SO' and OrderNbr gt '<OrderNbr>'

<OrderNbr> 은 이전 REST 호출로 내 보낸 마지막 판매 주문 번호입니다.

  • 따라서 다음 SO 유형의 첫 100 판매 주문을 요청하려면 http://localhost/AcumaticaERP/entity/Default/6.00.001/SalesOrder?$top=100&$filter=OrderType gt 'SO' and OrderNbr gt ''

다음은 C #으로 작성된 샘플 코드로, 여러 REST 호출이있는 100 개의 레코드 일괄 처리로 모든 판매 주문을 버전 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