6.com.nexacro17.xapi.tx (C#)

Edit

X-API의 데이터 통신을 수행합니다.

nexacro platform 또는 PlatformData를 이용하는 모든 클라이언트와 데이터 송수신을 수행합니다. 데이터 통신의 대부분의 경우 HTTP 상에서 수행되며, XML 등의 형식으로 변환된 후 송수신됩니다. 주요 클래스는 HttpPlatformRequest, HttpPlatformResponse 등입니다.

6.1시작하기

다음은 X-API을 이용하여 데이터를 송수신하는 간단한 예제입니다.

X-API를 이용한 예제

using Nexacro17.Xapi.Data;
using Nexacro17.Xapi.Tx;
using System;
public partial class XAPI_TEST : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // HttpRequest를 이용하여 PlatformRequest 생성
        PlatformRequest req = new PlatformRequest(Request.InputStream);

        // 데이터 수신
        req.ReceiveData();

        // 수신받은 데이터 획득
        PlatformData reqData = req.GetData();
        VariableList reqVarList = reqData.GetVariableList();

        // 부서명 획득
        string name = reqVarList.GetString("name");

        // 송신할 데이터 생성
        PlatformData resData = new PlatformData();
        VariableList resVarList = resData.GetVariableList();

        // 부서별 인원을 저장할 DataSet 생성
        DataSet employees = new DataSet("employees");

        // DataSet에 열(column) 추가
        employees.AddColumn(new ColumnHeader("name", DataTypes.STRING, 8));
        employees.AddColumn(new ColumnHeader("jobTitle", DataTypes.STRING));
        employees.AddColumn(new ColumnHeader("number", DataTypes.INT));
        employees.AddColumn(new ColumnHeader("manager", DataTypes.BOOLEAN));

        // 부서별 인원 데이터 추가
        if ("R&D Center".Equals(name)) {
          // 행(row) 추가
          int row = employees.NewRow();
          // 추가된 행(row)의 데이터 설정
          employees.Set(row, "name", "John Jones");
          employees.Set(row, "jobTitle", "developer");
          employees.Set(row, "number", 1234);
          employees.Set(row, "manager", false);
          // ...
          // 정상 수행
          resData.AddDataSet(employees);
          resVarList.Add("ERROR_CODE", 200);
        } else if ("Quality Assurance".Equals(name)) {
          // 행(row) 추가
          int row = employees.NewRow();
          // 추가된 행(row)의 데이터 설정
          employees.Set(row, "name", "Tom Glover");
          employees.Set(row, "jobTitle", "manager");
          employees.Set(row, "number", 9876);
          employees.Set(row, "manager", true);
          // ...
          // 정상 수행
          resData.AddDataSet(employees);
          resVarList.Add("ERROR_CODE", 200);
        } else {
          // 오류 발생
          resVarList.Add("ERROR_CODE", 500);
        }
        // HttpServletResponse를 이용하여 PlatformResponse 생성
        PlatformResponse res = new PlatformResponse(Response.OutputStream);
        res.SetData(resData);
        // 데이터 송신
        res.SendData();
    }
}

6.2데이터 송수신

nexacro platform과의 데이터 통신은 대부분의 경우 HTTP 상에서 수행되며, 특정 형식으로 변환된 후 송수신됩니다.

송수신 형식(contentType)은 데이터가 송수신되기 위해 객체에서 특정 형식의 데이터(stream)으로 변환되는 것을 의미하며, 프로토콜 형식(protocolType)은 데이터의 압축, 암호화 등을 수행하는 것을 의미합니다.

송수신 형식(contentType)과 프로토콜 형식(protocolType) 등 데이터 변환에 대한 주요 인터페이스는 다음과 같습니다.

인터페이스명

설 명

DataSerializer

PlatformData를 특정 형식의 데이터(stream)으로 변환

DataDeserializer

특정 형식의 데이터(stream)를 PlatformData로 변환

ProtocolEncoder

데이터(stream)의 압축, 암호화 등을 수행

ProtocolDecoder

압축, 암호화 등이 적용된 데이터(stream)를 압축 해제, 복호화 등을 수행

6.3데이터 송수신의 내부 흐름

데이터 송신 흐름

  1. Server에서 데이터를 PlatformData에 저장한 후 송신함

  2. DataSerializer에 의해 PlatformData가 특정 형식의 데이터(stream)로 변환됨

  3. ProtocolEncoder에 의해 압축, 암호화 등이 적용됨

  4. HTTP 상으로 데이터(stream)가 송신됨

데이터 수신 흐름

  1. HTTP 상에서 압축, 암호화 등이 적용된 데이터(stream)를 수신받음

  2. ProtocolDecoder에 의해 압축 해제, 복호화 등이 수행됨

  3. DataDeserializer에 의해 특정 형식의 데이터(stream)가 PlatformData로 변환됨

  4. Client에서 데이터가 저장된 PlatformData를 수신받음

6.4Server 상의 HTTP 데이터 통신

nexacro platform과 HTTP 상에서 데이터 통신을 하기 위해서는 PlatformRequest와 PlatformResponse를 이용하여 cs 파일을 작성합니다.

PlatformRequest와 PlatformResponse는 System.Web.HttpRequest와 System.Web.HttpResponse를 이용하여 HTTP 통신을 수행하며, PlatformRequest는 nexacro platform으로 데이터(stream)를 수신받은 후 PlatformData으로 변환하고, 그와는 반대로 PlatformResponse는 PlatformData를 데이터(stream)으로 변환한 후 nexacro platform으로 송신합니다.

HttpServletRequest으로부터 데이터 수신

// System.Web.HttpRequest를 이용하여 PlatformRequest 생성
PlatformRequest req = new PlatformRequest(Request.InputStream);
// 데이터 수신
req.ReceiveData();
PlatformData data = req.GetData();

HttpServletResponse으로 데이터 송신

PlatformData data = ...;
// System.Web.HttpResponse를 이용하여 PlatformResponse 생성
PlatformResponse res = new PlatformResponse(Response.OutputStream);
res.SetData(data);
// 데이터 송신
res.SendData();

echo.cs 예제

using Nexacro17.Xapi.Data;
using Nexacro17.Xapi.Tx;
using System;
public partial class XAPI_TEST : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        PlatformRequest req = new PlatformRequest(Request.InputStream);
        req.ReceiveData();
        PlatformData reqData = req.GetData();
        PlatformResponse res = new PlatformResponse(Response.OutputStream);
        res.SetData(data);
        res.SendData();
    }
}

6.5데이터 송수신 형식

송수신 형식은 데이터 송수신에서 언급되었듯이 데이터가 송수신되기 위해 객체에서 특정 형식의 데이터(stream)으로 변환되는 형식을 의미하며, 기 구현된 형식은 다음과 같습니다.

상수값

설 명

PlatformType.CONTENT_TYPE_XML

Platform에서 정의된 XML 형식

PlatformType.CONTENT_TYPE_BINARY

Platform에서 정의된 바이너리 형식

PlatformType.CONTENT_TYPE_SSV

Platform에서 정의된 SSV 형식

XML 형식으로 데이터를 수신하고, Binary 형식으로 데이터를 송신하는 예제

// XML 형식으로 데이터 수신
PlatformRequest req = new PlatformRequest(Request.InputStream, PlatformType.CONTENT_TYPE_XML);
req.ReceiveData();
PlatformData data = req.GetData();

// Binary 형식으로 데이터 송신
PlatformResponse res = new PlatformResponse(Response.OutputStream, PlatformType.CONTENT_TYPE_BINARY);
res.SetData(data);

res.SendData();

만약에 사용자에 의해 정의된 송수신 형식이 아닌 기 제공되는 송수신 형식인 경우에는 다음과 같이 PlatformRequest에 별도의 송수신 형식을 지정하지 않아도, 내부에서 자동으로 송수신 형식을 판단하여 처리합니다.

송수신 형식을 자동으로 판단하여 데이터 수신

// 송수신 형식을 자동으로 판단하여 데이터 수신
PlatformRequest req = new PlatformRequest(Request.InputStream);
req.ReceiveData();

PlatformData data = req.GetData();

6.6데이터 프로토콜 형식

프로토콜 형식은 데이터 송수신에서 언급되었듯이 데이터의 압축, 암호화 등을 수행하는 것을 의미하며, 기 구현된 형식은 다음과 같습니다.

상수값

설 명

PlatformType.PROTOCOL_TYPE_ZLIB

ZLIB 방식으로 압축

ZLIB 방식으로 압축하여 데이터 송신

// 데이터 수신
PlatformRequest req = new PlatformRequest(Request.InputStream);
req.ReceiveData();
PlatformData data = req.GetData();

// ZLIB 방식으로 압축하여 데이터 송신
PlatformResponse res = new PlatformResponse(Response.OutputStream, PlatformType.CONTENT_TYPE_BINARY);
res.AddProtocolType(PlatformType.PROTOCOL_TYPE_ZLIB);
res.SetData(data);

res.SendData();

6.7추가, 변경, 삭제된 데이터 송신

DataSet은 데이터가 추가, 변경, 삭제된 경우 변경된 상태와 변경 이전의 원본 데이터를 저장합니다. 자세한 정보는 DataSet의 원본 데이터와 변경된 데이터를 참조합니다.

PlatformResponse는 위와 같은 데이터를 저장 방식(saveType)에 따라 구분하여 전송합니다.

상수값

설 명

DataSet.SAVE_TYPE_NONE

미설정

DataSet.SAVE_TYPE_ALL

현재의 데이터와 추가, 변경, 삭제된 모든 데이터 저장 또는 전송

DataSet.SAVE_TYPE_NORMAL

현재의 데이터만 저장 또는 전송

DataSet.SAVE_TYPE_UPDATED

추가, 변경된 데이터만 저장 또는 전송

DataSet.SAVE_TYPE_DELETED

삭제된 데이터만 저장 또는 전송

DataSet.SAVE_TYPE_CHANGED

추가, 변경, 삭제된 데이터만 저장 또는 전송

저장 방식(saveType)은 PlatformData와 DataSet이 가지고 있으며, DataSet의 저장 방식이 우선으로 적용되고, DataSet의 저장 방식이 DataSet.SAVE_TYPE_NONE인 경우 PlatformData의 저장 방식이 적용됩니다.

만약에 PlatformData의 저장 방식도 DataSet.SAVE_TYPE_NONE인 경우 기본값 DataSet.SAVE_TYPE_NORMAL이 적용됩니다.