Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

ems servre에서 접속 IP를 알고 싶습니다.


임종범

질문

서버로 접속한 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

  • 0
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

커스텀 엔드포인트 요청한 클라이언트의 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.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
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;

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.