如何在 Delphi MARS REST API库中获取客户端的IP地址?

soat7uwm  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(126)

这个问题很多年前就在Delphi-PRAXIS上被问到了,但是这个问题中描述的方法现在已经不起作用了,而且是基于MARS的一个非常旧的版本。
基本上,这个人发布的内容和所问的内容,就是我在问的内容。这是他的代码:

[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;

字符串
我需要知道端点函数(xHomexAction)中的IP地址是什么。
TWebRequest似乎不再存在于MARS中。火星发生了很多变化。
有人能帮忙吗?

ttygqcqt

ttygqcqt1#

这花了我一段时间才找到,但基本上,有一个名为IMARSRequest的新接口,来自MARS.Core.RequestAndResponse.Interfaces单元,您可以使用它。
它的工作原理与旧的TWebRequest非常相似。
使用下面的代码,通过将[Context] MarsRequest: IMARSRequest;添加到protected字段,您可以从任何类函数访问marsRequest.GetRemoteIP,例如从xHomexAction

[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;

字符串
对于一些添加的信息,您还可以将其用于单个端点,而不是类中的每个端点。您可以将其作为函数中的参数添加,如以下简短的代码示例:

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;

相关问题