2012-12-23 13 views
6

Zaimplementowałem ten sam kod (w celu opublikowania formularza) za pomocą delphi i Pythona. Kod Pythona działa idealnie, ale kod delphi kończy się niepowodzeniem. W pythonie mogę po prostu napisać httplib2.debuglevel=4, aby zobaczyć, jaka zawartość została faktycznie wysłana na serwer. ale nie mam pojęcia, jak wydrukować zawartość w delphi.Jak śledzić surową treść żądania i odpowiedzi TIdHttp

def python_request_data(url, cookie, data): 
    httplib2.debuglevel = 4 
    conn = httplib2.Http() 
    conn.follow_all_redirects = True 
    headers = {'Cookie': cookie, 'Content-Type': 'application/x-www-form-urlencoded'} 
    response, contents = conn.request(url, 'POST', data, headers=headers) 

procedure DelphiRequestData(const Url, Cookie, Data: string); 
var 
    Client: TIdHttp; 
    Params: TStringList; 
    Response: string; 
begin 
    Client := TIdHttp.Create(nil); 
    try 
    Client.HTTPOptions := [hoKeepOrigProtocol]; 
    Client.Request.CustomHeaders.AddValue('Cookie', Cookie); 
    Params := TStringList.Create; 
    try 
     Params.QuoteChar := #0; 
     Params.Delimiter := '&'; 
     Params.DelimiterText := Data; 
     Client.Request.ContentType := 'application/x-www-form-urlencoded'; 
     Client.Request.ContentLength := Length(Params.DelimitedText); 
     Response := Client.Post(Url, Params); 
    finally 
     Params.Free; 
    end; 
    finally 
    Client.Free; 
    end; 
end; 

Wszelkie wskazówki są mile widziane.

+0

Dzięki za podpowiedzi do @ albummi. Po obejrzeniu dziennika zobaczyłem, że TIdHttp wysyła niepoprawną wersję protokołu, chyba że ustawię Client.HTTPOptions: = [hoKeepOrigProtocol]. – stanleyxu2005

Odpowiedz

4

Możesz użyć TIdLogDebug jako Przechwytywanie IdHttp.
Zdarzenia OnSend i OnReceive dostarczą pożądane informacje w tablicy lub w tonach TB.

+4

'TIdLogDebug' wyprowadza swoje dane bezpośrednio do dziennika zdarzeń debuggera. Jeśli chcesz przechwycić dane we własnym kodzie, użyj zamiast tego 'TIdLogEvent'. Zdarzenia 'OnSent' i' OnReceived' dostarczają danych jako wartości 'String', a nie jako wartości' TBytes' (myślisz o niższej warstwy 'Send()' i 'Receive()' metodach 'TIdLogBase') . –

Powiązane problemy