2012-06-14 3 views
0

У меня есть приложение Delphi XE2 Win32, которое подключается к службе REST с использованием DataSnap HTTP. В HTTP-соединении используется заголовок «User-Agent» по умолчанию «Mozilla/3.0 (совместимый, Indy Library)». Я хотел бы изменить это, чтобы быть чем-то более конкретным для моего приложения, чтобы я мог контролировать подключения на сервере из разных выпусков приложений. Я использую TDSRESTConnection для подключения - может ли кто-нибудь указать мне на объект/свойство, с которым мне нужно работать, чтобы установить «User-Agent»? Я пробовал использовать следующее:Delphi DataSnap - изменить свойство HTTP-заголовка User-Agent в клиентских подключениях

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

но это не имело значения.

ответ

1

К сожалению, ваши пользовательские заголовки очищены и проигнорированы в TDSRestRequest.GetHTTPTDSRestRequest скрыт в исполнении 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. 
+0

привет, большое спасибо за отзыв. Простите меня, но можете ли вы просто подтвердить, что введенный вами код должен быть помещен в блок Datasnap.DSClientRest, или его можно просто добавить в качестве нового модуля в моем проекте? –

+0

Привет, извините, я не был достаточно ясен. Поместите код в любую отдельную единицу. Я написал этот код специально, чтобы не изменять оригинальный исходный код Datasnap. В противном случае вы можете просто исправить его в 'TDSRestRequest.GetHTTP' очень легко. –

+0

Фантастический, я не понимаю, как это работает, но он работает! Большое спасибо. –