如何在Delphi MARS REST API的Server.Resources函数中获取客户端IP?
在新版MARS中获取客户端IP的解决方案
核心实现思路
新版MARS通过THttpRequest类提供请求上下文的访问能力,我们可以借助参数注入的方式,在接口方法中直接获取该对象,进而提取客户端IP。
具体操作步骤
引入必要单元
首先需要导入MARS.Core.Http单元,该单元包含THttpRequest的定义。修改接口方法参数
在需要获取IP的方法中,添加由[Context](或[Request])修饰的THttpRequest类型参数,MARS会自动注入当前请求的上下文实例。提取客户端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
相关产品推荐
相关产品推荐

