【问题标题】:Delphi DataSnap - Change 'User-Agent' HTTP header property in client connectionsDelphi DataSnap - 更改客户端连接中的“用户代理”HTTP 标头属性
【发布时间】:2012-06-14 07:58:56
【问题描述】:

我有一个使用 DataSnap HTTP 连接到 REST 服务的 Delphi XE2 Win32 应用程序。 HTTP 连接使用“Mozilla/3.0 (compatible; Indy Library)”的默认“User-Agent”标头。我想将此更改为更特定于我的应用程序,以便我可以监视来自不同应用程序版本的服务器上的连接。我正在使用 TDSRESTConnection 进行连接 - 任何人都可以指向我需要使用的对象/属性来设置“用户代理”吗?我尝试过使用以下内容:

TDSRESTConnection.HTTP.Request.CustomHeaders.AddValue('User-Agent', 'MyText');

但这并没有什么不同。

【问题讨论】:

    标签: delphi http delphi-xe2 user-agent datasnap


    【解决方案1】:

    不幸的是,您的自定义标头在TDSRestRequest.GetHTTP 中被清除和忽略(TDSRestRequest 隐藏在Datasnap.DSClientRest 单元的实现中)。 试试这个解决方法:

    uses
      Datasnap.DSHTTP, IdHTTPHeaderInfo;
    
    const
      SUserAgent = 'MyUserAgent';
    
    type
      TDSHTTPEx = class(TDSHTTP)
        constructor Create(AOwner: TComponent; const AIPImplementationID: string); override;
      end;
    
      TDSHTTPSEx = class(TDSHTTPS)
        constructor Create(const AIPImplementationID: string); override;
      end;
    
    { TDSHTTPEx }
    
    constructor TDSHTTPEx.Create(AOwner: TComponent; const AIPImplementationID: string);
    begin
      inherited Create(AOwner, AIPImplementationID);
      with Request.GetObject as TIdRequestHeaderInfo do
        UserAgent := SUserAgent;
    end;
    
    { TDSHTTPSEx }
    
    constructor TDSHTTPSEx.Create(const AIPImplementationID: string);
    begin
      inherited Create(AIPImplementationID);
      with Request.GetObject as TIdRequestHeaderInfo do
        UserAgent := SUserAgent;
    end;
    
    initialization
      TDSHTTP.UnregisterProtocol('http');
      TDSHTTP.RegisterProtocol('http', TDSHTTPEx);
      TDSHTTP.UnregisterProtocol('https');
      TDSHTTPS.RegisterProtocol('https', TDSHTTPSEx);
    
    finalization
      TDSHTTP.UnregisterProtocol('http');
      TDSHTTP.UnregisterProtocol('https');
    
    end.
    

    【讨论】:

    • 您好,非常感谢您的回复。请原谅我,您能否确认您发布的代码将放置在 Datasnap.DSClientRest 单元中,还是可以将其作为新单元添加到我的项目中?
    • 嗨,对不起,我不够清楚。将代码放在您自己的任何单元中。我专门编写了这段代码,以避免修改原始 Datasnap 源代码。否则你可以很容易地在TDSRestRequest.GetHTTP 中修复它。
    • 太棒了,我不明白它是如何工作的,但它确实有效!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2012-05-31
    • 2018-01-12
    • 2011-05-09
    • 2020-09-12
    相关资源
    最近更新 更多