You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi MARS REST API的Server.Resources函数中获取客户端IP?

在新版MARS中获取客户端IP的解决方案

核心实现思路

新版MARS通过THttpRequest类提供请求上下文的访问能力,我们可以借助参数注入的方式,在接口方法中直接获取该对象,进而提取客户端IP。

具体操作步骤

  1. 引入必要单元
    首先需要导入MARS.Core.Http单元,该单元包含THttpRequest的定义。

  2. 修改接口方法参数
    在需要获取IP的方法中,添加由[Context](或[Request])修饰的THttpRequest类型参数,MARS会自动注入当前请求的上下文实例。

  3. 提取客户端IP

    • 直接调用THttpRequest.RemoteIP属性获取客户端的直接连接IP。
    • 如果服务部署在反向代理(如Nginx、Apache)之后,需要读取X-Forwarded-For请求头来获取真实客户端IP,该头可能包含多个IP(逗号分隔),取第一个值即可。

完整代码示例

uses
  MARS.Core.Http;

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

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

function TProjectXServicesResource.xHome([QueryParam] lang : String; [Context] ARequest: THttpRequest) : String;
var
  ClientIP: string;
begin
  // 获取直接连接的客户端IP
  ClientIP := ARequest.RemoteIP;
  // 反向代理场景下读取真实IP
  if ARequest.Headers.ContainsKey('X-Forwarded-For') then
    ClientIP := ARequest.Headers['X-Forwarded-For'].Split([','])[0].Trim;
  // 后续业务逻辑...
end;

function TProjectXServicesResource.xAction([FormParams] AParams: TArray<TFormParam>; [Context] ARequest: THttpRequest) : String;
var
  ClientIP: string;
begin
  ClientIP := ARequest.RemoteIP;
  // 反向代理场景处理
  if ARequest.Headers.ContainsKey('X-Forwarded-For') then
    ClientIP := ARequest.Headers['X-Forwarded-For'].Split([','])[0].Trim;
  // 后续业务逻辑...
end;

补充说明

  • [Context]和[Request]属性的作用一致,都可以注入THttpRequest实例,根据个人习惯选择即可。
  • 若服务未经过反向代理,直接使用RemoteIP就能得到正确的客户端IP;若有代理层,必须确保代理服务器正确设置X-Forwarded-For头,否则无法获取真实IP。

内容的提问来源于stack exchange,提问作者Shaun Roselt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:01:06