Search code examples
delphiip-address

How do I get the client's IP Address in a Server.Resources function with the Delphi MARS REST API Library?


This question was asked on Delphi-PRAXIS many years ago, but the method described in that question doesn't work anymore and is based on a very old version of MARS.

Basically exactly what the person posted and is asking, is what I am asking. Here's his code:

  [Path('projectX')]
  TProjectXServicesResource = class
  protected
  public
    [GET, Produces(TMediaType.TEXT_HTML)]
    function xHome([QueryParam] lang : String) : String;

    [POST, Consumes(TMediaType.MULTIPART_FORM_DATA), Produces(TMediaType.TEXT_HTML)]
    function xAction([FormParams] AParams: TArray<TFormParam>): String;
  end;

function TProjectXServicesResource.xHome([QueryParam] lang : String) : String;
begin
  // Need access to the client's IP here
end;

function TProjectXServicesResource.xAction([FormParams] AParams: TArray<TFormParam>) : String;
begin
  // Need access to the client's IP here
end;

I need to know what the IP Address is within the endpoint functions (xHome and xAction).

TWebRequest doesn't seem to exist in MARS anymore. Lots have changed in MARS.

Can anyone help, please?


Solution

  • This took me a while to find, but basically, there's a new interface called IMARSRequest from the MARS.Core.RequestAndResponse.Interfaces unit that you can use for this.

    It works very similar to the old TWebRequest.

    Using the code below by adding [Context] MarsRequest: IMARSRequest; to the protected field, you can access marsRequest.GetRemoteIP from any of your class functions such as from xHome and xAction:

      [Path('projectX')]
      TProjectXServicesResource = class
      protected
        [Context] marsRequest: IMARSRequest;
      public
        [GET, Produces(TMediaType.TEXT_HTML)]
        function xHome([QueryParam] lang : String) : String;
    
        [POST, Consumes(TMediaType.MULTIPART_FORM_DATA), Produces(TMediaType.TEXT_HTML)]
        function xAction([FormParams] AParams: TArray<TFormParam>): String;
      end;
    
    function TProjectXServicesResource.xHome([QueryParam] lang : String) : String;
    begin
      ShowMessage(marsRequest.GetRemoteIP);
    end;
    
    function TProjectXServicesResource.xAction([FormParams] AParams: TArray<TFormParam>) : String;
    begin
      ShowMessage(marsRequest.GetRemoteIP);
    end;
    

    For some added info, you can also use it for an individual endpoint instead of everyone in the class. You can add it as a parameter in the function such as this short code sample here:

    type
      [Path('helloworld')]
      THelloWorldResource = class
      protected
      public
        [GET, Path('ip_address'), Produces(TMediaType.TEXT_PLAIN)]
        function SayIPAddress([Context] MarsRequest: IMARSRequest): string;
      end;
    
    implementation
    
    uses
      MARS.Core.Registry;
    
    { THelloWorldResource }
    
    function THelloWorldResource.SayIPAddress([Context] MarsRequest: IMARSRequest): string;
    begin
      var RemoteIP := MarsRequest.GetRemoteIP;
      Result := 'Hello, your Remote IP is ' + RemoteIP;
    end;