공통 [10.3 리오] RAD 서버 엔드 포인트 연동이 더욱 쉽고 다양해 졌습니다.
2018.12.06 15:19
RAD 스튜디오 10.3 리오는 RAD 서버의 성능향상과 엔드 포인트 연동을 더 쉽고 유연하게 작성할 수 있는 특성등이 추가되었습니다.
엔드 포인트 메소드와 Content-Type, Accept 연동 특성 추가
커스텀 리소스에 요청 시 URL과 HTTP 메소드에만 의존하지 않고, HTTP 해더의 Accept 및 Cotnet-Type에 따라 엔드 포인트 메소드를 연결하는 특성이 추가되었습니다. 이제 동일한 URL 및 HTTP 메소드라도 Accept 및 Content-Type에 따라 다른 동작을 구현할 수 있습니다.
- EndpointProduce : GET 메소드의 엔드 포인트에 추가할 수 있습니다. HTTP 해더의 Accept 항목 값과 일치하는 MIME 타입/파일 확장자를 파라메터로 지정합니다.
- EndpointConsume : PUT / POST / PATCH 메소드의 엔드 포인트에 추가할 수 있습니다. HTTP 해더의 Content-Type 항목 값과 일치하는 MIME 타입/파일 확장자를 파라메터로 지정합니다.
코드 예제:
type
[ResourceName('Test')]
TTestResource = class(TDataModule)
public
[ResourceSuffix('*')]
[EndpointProduce('image/jpeg')]
procedure GetImage(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
[ResourceSuffix('*')] [EndpointProduce('application/pdf')]
procedure GetPdf(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
end;const AResponse: TEndpointResponse);
커스텀 메소드와 HTTP 메소드 연결 특성 추가
RAD 서버의 이전 버전에서는 HTTP 메소드(GET, POST 등)의 엔드 포인트 메소드 이름과 매핑되었습니다.
이제 위 방식 외에도 다른이름의 메소드를 엔드 포인트 메소드로 매핑할 수 있는 EndpointMethod 특성이 추가되었습니다.
코드 예제:
type
[ResourceName('Test')]
TTestResource = class(TDataModule)
public
[EndpointMethod(TEndpointRequest.TMethod.Get)]
procedure PrintEmps(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
end;
요청 처리를 클래스 또는 컴포넌트로 위임
RAD 서버의 사용자 리소스에 발생한 요청을 필드로 지정한 다른 자원 모듈(클래스 / 컴포넌트)로 위임하는 기능이 추가되었습니다.
위임받는 클래스는 IEMSEndpointPublisher 인터페이스를 구현해야 합니다.
코드 예제:
type
TEmpsProvider = class(TComponent, IEMSEndpointPublisher)
private
class var
FArray: TJSONArray;
private
function GetItemByID(ARequest: TEndpointRequest): Integer;
class constructor Create;
class destructor Destroy;
public
procedure Get(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse); overload;
[ResourceSuffix('./{id}')]
procedure GetItem(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse); overload;
[ResourceSuffix('./{id}')]
procedure Put(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
procedure Post(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
[ResourceSuffix('./{id}')]
procedure Delete(const AContext: TEndpointContext;
const ARequest: TEndpointRequest;
const AResponse: TEndpointResponse);
end;
[ResourceName('Test')]
TTestResource = class(TDataModule)
public
Emps: TEmpsProvider;
constructor Create(AOwner: TComponent); override;
end;
위와 같이 구현 시 다음 요청은 Emps 객체인 TEmpsProvider의 메소드에 의해 다음과 같이 처리됩니다.
- GET http://localhost/test/emps - TEmpsProvider.Get 메소드
- GET http://localhost/test/emps/1 - TEmpsProvider.GetItem 메소드
JSON 처리를 위한 헬퍼 컴포넌트 추가
컴포넌트에 요청 처리를 위임하는 새로운 기능을 이용해 RAD 스튜디오 10.3 리오에서 JSON 처리를 단순화 하는 새로운 컴포넌트가 추가되었습니다.
- TEMSFileResource : 경로 및 파일이름 속성에 지정된 파일로 요청 처리
- TEMDDataSetResource : DataSet 속성에 설정된 데이터셋의 데이터를 JSON으로 처리, 페이징 파라메터 지원
코드 샘플:
[ResourceName('Notes')]
TNotesResource1 = class(TDataModule)
FDConnection1: TFDConnection; // connects to SQLite DB with "notes" table
FDQuery1: TFDQuery; // SELECT * FROM Notes
[ResourceSuffix('list', '/')]
[ResourceSuffix('get', '/{id}')]
[ResourceSuffix('put', '/{id}')]
[ResourceSuffix('post', '/')]
[ResourceSuffix('delete', '/{id}')]
EMSDBResource1: TEMSDataSetResource;
end;
// database resource
[ResourceSuffix('/')]
EMSDBResource1: TEMSDataSetResource;
[ResourceSuffix('/')]
[EndpointProduce('get', 'image/jpeg, image/png')]
EMSDBResource1: TEMSDataSetResource;
// file resource
[ResourceSuffix('/')]
[EndpointProduce('get', 'application/pdf')]
EMSFileResource1: TEMSFileResource;
RAD 서버의 기타 개선사항
- RAD 서버의 성능이 간단한 작업 시 처리량이 10배 이상 향상되었습니다.
10.3 리오의 업데이트 버전들