임종범 10월 15일, 2021에 포스트됨 공유하기 10월 15일, 2021에 포스트됨 서버로 접속한 client의 IP을 알고 싶습니다. sample로 만든 source입니다. unit uTest; // EMS Resource Module interface uses System.SysUtils, System.Classes, System.JSON, EMS.Services, EMS.ResourceAPI, EMS.ResourceTypes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.Oracle, FireDAC.Phys.OracleDef, FireDAC.ConsoleUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.VCLUI.Wait, FireDAC.Phys.ODBC, FireDAC.Phys.ODBCDef, EMSHosting.ExtensionsServices, EMSHosting.EdgeHTTPListener, REST.Backend.Providers, EMSHosting.EdgeService; type [ResourceName('testapi')] {$METHODINFO ON} TSeromapiResource1 = class published [EndPointRequestSummary('Tests', 'ListItems', 'Retrieves list of items', 'application/json', '')] [EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spObject, TAPIDoc.TPrimitiveFormat.None, '', '')] procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); [EndPointRequestSummary('Tests', 'GetItem', 'Retrieves item with specified ID', 'application/json', '')] [EndPointRequestParameter(TAPIDocParameter.TParameterIn.Path, 'item', 'A item ID', true, TAPIDoc.TPrimitiveType.spString, TAPIDoc.TPrimitiveFormat.None, TAPIDoc.TPrimitiveType.spString, '', '')] [EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spObject, TAPIDoc.TPrimitiveFormat.None, '', '')] [EndPointResponseDetails(404, 'Not Found', TAPIDoc.TPrimitiveType.spNull, TAPIDoc.TPrimitiveFormat.None, '', '')] [ResourceSuffix('{item}')] procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); [EndPointRequestSummary('Tests', 'PostItem', 'Creates new item', '', 'application/json')] [EndPointRequestParameter(TAPIDocParameter.TParameterIn.Body, 'body', 'A new item content', true, TAPIDoc.TPrimitiveType.spObject, TAPIDoc.TPrimitiveFormat.None, TAPIDoc.TPrimitiveType.spObject, '', '')] [EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spNull, TAPIDoc.TPrimitiveFormat.None, '', '')] [EndPointResponseDetails(409, 'Item Exist', TAPIDoc.TPrimitiveType.spNull, TAPIDoc.TPrimitiveFormat.None, '', '')] procedure Post(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); private end; {$METHODINFO OFF} procedure TSeromapiResource1.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); begin // Sample code AResponse.Body.SetValue(TJSONString.Create('seromapi'), true) end; procedure TSeromapiResource1.GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); var LItem: string; JSONValue: TJSONValue; begin try // logFile('GetItem:' + ARequest.Headers.GetValue('Host')); except on e: Exception do begin logfile('RAD Server 500 : ' + e.Message); JSONValue := setError(e.Message); end; end; AResponse.Body.SetValue(JSONValue, true) // AResponse.Body.SetValue(TJSONString.Create('seromapi ' + LItem), True) end; procedure Register; begin RegisterResource(TypeInfo(TSeromapiResource1)); end; initialization Register; end. 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 험프리 10월 25일, 2021에 포스트됨 공유하기 10월 25일, 2021에 포스트됨 On 2021. 10. 19. at 오후 3시 52분, 임종범 said: 제가 사용하고 있는 버전이 10.4인데 쫓아가면 아래와 같습니다. /// <summary>Retrieve the endpoint request client host IP</summary> property ClientHost: string read GetClientHost; 없습니다. 확인해 보니 GetClientHost 메소드는 11.0 버전부터 제공하는 것으로 확인했습니다. 커스텀 엔드포인트에서 클라이언트의 IP 주소를 취득하는 코드를 사용하시려면 11.0 버전으로 진행을 권장드립니다. On 2021. 10. 18. at 오후 4시 41분, 험프리 said: TEndpointRequest.ClientHost를 사용하면 Client의 IP 주소를 취득할 수 있습니다. (참고로, 11.0 소스코드를 확인해 클라이언트 IP 주소를 취득하는 과정을 찾아봤지만, 찾지 못했습니다. RAD 서버의 엔진관련 코드로 비공개 된 것으로 예상됩니다. HTTP 해더에서 클라이언트 IP 취득 가능할까 하고, X-Forwarded-Host 등 사용 가능한지 확인한 과정도 성공하지 못했습니다.) 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 험프리 10월 18일, 2021에 포스트됨 공유하기 10월 18일, 2021에 포스트됨 커스텀 엔드포인트 요청한 클라이언트의 IP 주소를 취득하고자 하는 것으로 파악됩니다. On 2021. 10. 15. at 오후 2시 0분, 임종범 said: procedure TSeromapiResource1.GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse); 커스텀 엔드포인트의 메소드는 위와 같습니다. 요청한 정보의 경우 ARequest: TEndpointRequest에서 취득 가능합니다. TEndpointRequest 클래스의 public property 목록은 다음과 같습니다. (참고로, RAD 스튜디오 코드 에디터에서 TEndpointRequest를 Ctrl + 클릭하면 선언된 곳으로 이동(Find Declaration)됩니다.) public property Body: TBody read GetBody; property Headers: THeaders read GetHeaders; property Method: TMethod read GetMethod; property MethodString: string read GetMethodString; property Params: TParams read GetParams; property Segments: TSegments read GetSegments; property Resource: string read GetResource; /// <summary>Retrieve the endpoint request BasePath</summary> property BasePath: string read GetBasePath; /// <summary>Retrieve the endpoint request Host header</summary> property ServerHost: string read GetServerHost; /// <summary>Retrieve the endpoint request client host IP</summary> property ClientHost: string read GetClientHost; end; 위 목록 중 TEndpointRequest.ClientHost를 사용하면 Client의 IP 주소를 취득할 수 있습니다. ----- 문제가 해결되었는지(또는 도움이 되었는지) 답변 주시면 비슷한 이슈가 발생한 다른 개발자들에게 큰 도움이 됩니다. 답변 부탁드립니다. 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 임종범 10월 19일, 2021에 포스트됨 Author 공유하기 10월 19일, 2021에 포스트됨 제가 사용하고 있는 버전이 10.4인데 쫓아가면 아래와 같습니다. /// <summary>Retrieve the endpoint request client host IP</summary> property ClientHost: string read GetClientHost; 없습니다. TEndpointRequest = class public type TMethod = (Get, Put, Post, Head, Delete, Patch, Other); THeaders = TEndpointHeaders; TParams = TEndpointParams; TSegments = TEndpointSegments; TBody = TEndpointRequestBody; protected function GetHeaders: THeaders; virtual; abstract; function GetParams: TParams; virtual; abstract; function GetSegments: TSegments; virtual; abstract; function GetBody: TBody; virtual; abstract; function GetMethod: TMethod; virtual; abstract; function GetMethodString: string; virtual; abstract; function GetResource: string; virtual; abstract; function GetBasePath: string; virtual; abstract; function GetServerHost: string; virtual; abstract; public property Body: TBody read GetBody; property Headers: THeaders read GetHeaders; property Method: TMethod read GetMethod; property MethodString: string read GetMethodString; property Params: TParams read GetParams; property Segments: TSegments read GetSegments; property Resource: string read GetResource; /// <summary>Retrieve the endpoint request BasePath</summary> property BasePath: string read GetBasePath; /// <summary>Retrieve the endpoint request Host</summary> property ServerHost: string read GetServerHost; end; 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
0 임종범 10월 19일, 2021에 포스트됨 Author 공유하기 10월 19일, 2021에 포스트됨 23시간 전, 험프리 said: 커스텀 엔드포인트 요청한 클라이언트의 IP 주소를 취득하고자 하는 것으로 파악됩니다. 커스텀 엔드포인트의 메소드는 위와 같습니다. 요청한 정보의 경우 ARequest: TEndpointRequest에서 취득 가능합니다. TEndpointRequest 클래스의 public property 목록은 다음과 같습니다. (참고로, RAD 스튜디오 코드 에디터에서 TEndpointRequest를 Ctrl + 클릭하면 선언된 곳으로 이동(Find Declaration)됩니다.) public property Body: TBody read GetBody; property Headers: THeaders read GetHeaders; property Method: TMethod read GetMethod; property MethodString: string read GetMethodString; property Params: TParams read GetParams; property Segments: TSegments read GetSegments; property Resource: string read GetResource; /// <summary>Retrieve the endpoint request BasePath</summary> property BasePath: string read GetBasePath; /// <summary>Retrieve the endpoint request Host header</summary> property ServerHost: string read GetServerHost; /// <summary>Retrieve the endpoint request client host IP</summary> property ClientHost: string read GetClientHost; end; 위 목록 중 ClientHost를 사용하면 Client의 IP 주소를 취득할 수 있습니다. ----- 문제가 해결되었는지(또는 도움이 되었는지) 답변 주시면 비슷한 이슈가 발생한 다른 개발자들에게 큰 도움이 됩니다. 답변 부탁드립니다. 제가 사용하고 있는 버전이 10.4인데 쫓아가면 아래와 같습니다. /// <summary>Retrieve the endpoint request client host IP</summary> property ClientHost: string read GetClientHost; 없습니다. TEndpointRequest = class public type TMethod = (Get, Put, Post, Head, Delete, Patch, Other); THeaders = TEndpointHeaders; TParams = TEndpointParams; TSegments = TEndpointSegments; TBody = TEndpointRequestBody; protected function GetHeaders: THeaders; virtual; abstract; function GetParams: TParams; virtual; abstract; function GetSegments: TSegments; virtual; abstract; function GetBody: TBody; virtual; abstract; function GetMethod: TMethod; virtual; abstract; function GetMethodString: string; virtual; abstract; function GetResource: string; virtual; abstract; function GetBasePath: string; virtual; abstract; function GetServerHost: string; virtual; abstract; public property Body: TBody read GetBody; property Headers: THeaders read GetHeaders; property Method: TMethod read GetMethod; property MethodString: string read GetMethodString; property Params: TParams read GetParams; property Segments: TSegments read GetSegments; property Resource: string read GetResource; /// <summary>Retrieve the endpoint request BasePath</summary> property BasePath: string read GetBasePath; /// <summary>Retrieve the endpoint request Host</summary> property ServerHost: string read GetServerHost; end; 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
질문
임종범
서버로 접속한 client의 IP을 알고 싶습니다.
sample로 만든 source입니다.
unit uTest;
// EMS Resource Module
interface
uses
System.SysUtils, System.Classes, System.JSON,
EMS.Services, EMS.ResourceAPI, EMS.ResourceTypes, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf,
FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys,
FireDAC.Phys.Oracle, FireDAC.Phys.OracleDef, FireDAC.ConsoleUI.Wait,
FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.VCLUI.Wait,
FireDAC.Phys.ODBC, FireDAC.Phys.ODBCDef, EMSHosting.ExtensionsServices,
EMSHosting.EdgeHTTPListener, REST.Backend.Providers, EMSHosting.EdgeService;
type
[ResourceName('testapi')]
{$METHODINFO ON}
TSeromapiResource1 = class
published
[EndPointRequestSummary('Tests', 'ListItems', 'Retrieves list of items',
'application/json', '')]
[EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spObject,
TAPIDoc.TPrimitiveFormat.None, '', '')]
procedure Get(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
[EndPointRequestSummary('Tests', 'GetItem',
'Retrieves item with specified ID', 'application/json', '')]
[EndPointRequestParameter(TAPIDocParameter.TParameterIn.Path, 'item',
'A item ID', true, TAPIDoc.TPrimitiveType.spString,
TAPIDoc.TPrimitiveFormat.None, TAPIDoc.TPrimitiveType.spString, '', '')]
[EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spObject,
TAPIDoc.TPrimitiveFormat.None, '', '')]
[EndPointResponseDetails(404, 'Not Found', TAPIDoc.TPrimitiveType.spNull,
TAPIDoc.TPrimitiveFormat.None, '', '')]
[ResourceSuffix('{item}')]
procedure GetItem(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
[EndPointRequestSummary('Tests', 'PostItem', 'Creates new item', '',
'application/json')]
[EndPointRequestParameter(TAPIDocParameter.TParameterIn.Body, 'body',
'A new item content', true, TAPIDoc.TPrimitiveType.spObject,
TAPIDoc.TPrimitiveFormat.None, TAPIDoc.TPrimitiveType.spObject, '', '')]
[EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spNull,
TAPIDoc.TPrimitiveFormat.None, '', '')]
[EndPointResponseDetails(409, 'Item Exist', TAPIDoc.TPrimitiveType.spNull,
TAPIDoc.TPrimitiveFormat.None, '', '')]
procedure Post(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
private
end;
{$METHODINFO OFF}
procedure TSeromapiResource1.Get(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
begin
// Sample code
AResponse.Body.SetValue(TJSONString.Create('seromapi'), true)
end;
procedure TSeromapiResource1.GetItem(const AContext: TEndpointContext;
const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
LItem: string;
JSONValue: TJSONValue;
begin
try
// logFile('GetItem:' + ARequest.Headers.GetValue('Host'));
except
on e: Exception do
begin
logfile('RAD Server 500 : ' + e.Message);
JSONValue := setError(e.Message);
end;
end;
AResponse.Body.SetValue(JSONValue, true)
// AResponse.Body.SetValue(TJSONString.Create('seromapi ' + LItem), True)
end;
procedure Register;
begin
RegisterResource(TypeInfo(TSeromapiResource1));
end;
initialization
Register;
end.
이 댓글 링크
다른 사이트에 공유하기
4 answers to this question
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.