2012-12-23 2 views
6

Ablaufverfolgung Ich implementiert den gleichen Code (um ein Formular zu veröffentlichen) mit Delphi und Python. Der Python-Code funktioniert einwandfrei, aber Delphi-Code schlägt fehl. In Python kann ich einfach httplib2.debuglevel=4 schreiben, um zu sehen, welcher Inhalt tatsächlich an den Server gesendet wurde. aber ich habe keine Ahnung, wie ich den Inhalt in Delphi drucken soll.Wie rohe Anfrage und Antwort Inhalt von 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; 

Alle Hinweise sind willkommen.

+0

Danke für die Hinweise von @Bummi. Nachdem ich das Protokoll gesehen habe, habe ich gesehen, dass TIdHttp eine falsche Protokollversion sendet, wenn ich nicht Client.HTTPOptions: = [hoKeepOrigProtocol] gesetzt habe. – stanleyxu2005

Antwort

4

Sie können TIdLogDebug als Intercept Ihrer IdHttp verwenden.
Die Ereignisse OnSend und OnReceive liefern die gewünschten Informationen in einem Array oder TBytes.

+4

'TIdLogDebug' gibt seine Daten direkt an das Debugger-Ereignisprotokoll aus. Wenn Sie die Daten in Ihrem eigenen Code erfassen möchten, verwenden Sie stattdessen "TIdLogEvent". Seine OnSent- und OnReceived-Ereignisse liefern die Daten als 'String'-Werte, nicht als' TBytes'-Werte (Sie denken an die '' '(' '' '' '' '' '' '' '' '' '' Receive()) Methoden. . –

Verwandte Themen