acumatica
REST 계약 기반 API를 통한 레코드 내보내기
수색…
소개
이 항목에서는 Rum Contract-Based API를 통해 Acumatica ERP에서 레코드를 내보내는 방법을 보여줍니다. Acumatica ERP의 스크린 기반 API와 달리 계약 기반 API는 SOAP 및 REST 인터페이스를 모두 제공합니다. Contract-Based API에 대한 자세한 내용은 Acumatica ERP Documentation을 참조하십시오.
비고
Acumatica ERP의 REST Contract-Based API와 통신하려면 클라이언트 애플리케이션이 항상 다음 세 단계를 수행해야합니다.
Acumatica ERP 인스턴스에 로그인하여 사용자 세션 정보로 쿠키 가져 오기
Acumatica ERP 인스턴스에서 사용 가능한 계약 기반 API 엔드 포인트 중 하나와 상호 작용합니다.
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;
}
}