2012-10-19 11 views
10

Ich versuche, Code von TWebBrowser in Chromium zu konvertieren, habe aber Probleme herauszufinden, wie Post-und Header-Daten mit einer HTTP-Anfrage zu senden.Wie sende ich Post- und Kopfdaten mit Chromium?

Unten ist die TWebBrowser Funktionalität, die ich versuche zu implementieren.

var 
VHeader, PostData: OleVariant; 


PostData := VarArrayCreate([0, Length(XMLString) - 1], varByte) ;  
HeaderData := 'Content-Type: application/x-www-form-urlencoded'+ '\n'; 

WebBrowser1.Navigate(StrUrl,EmptyParam,EmptyParam,PostData,VHeader); 

Wie mache ich das Äquivalent mit Chrom?

+0

In diesem Thread gibt es [ 'die example'] (https://groups.google.com/forum/?fromgroups=#!topic/delphichromiumembedded/r1_ytEvBHEs) eine Anforderung POST hergestellt von Delphi CEF-Wrapper Autor selbst. Wenn ich nach Delphi komme und einen Platz zum Testen finde, poste ich dies als Antwort (wenn jemand nicht schneller sein wird :-) – TLama

+1

Danke, ich werde mich darum kümmern. – Trevor

+0

Also ich habe es funktioniert .. (mit Ihrem Beispiel TLama) Alle außer dem Hinzufügen der Header-Daten .. Meine Anwendung scheint ohne es gut laufen (oder seine bereits standardmäßig eingestellt) .. Aber wenn jemand weiß, wie es geht mit die Kopfdaten, oder möchte noch antworten Ich würde immer noch interessiert sein .. Fühlen Sie sich frei, diesen Link als Antwort zu setzen, und ich werde es akzeptieren .. Danke! – Trevor

Antwort

9

Aufgrund einer fehlenden Dokumentation für Delphi Chromium Embedded, verweise ich die erforderlichen Anforderungen für das Senden von Webanforderungen für die C++ - Version von CEF. Sie müssen also die Methode LoadRequest verwenden, um Anforderungen in Chrom zu senden. Zur Verwendung benötigen Sie die Objektinstanz der Objektklasse CefRequest zusammen mit den Objekten HeaderMap und CefPostData für die Anforderungsheader- und Datenspezifikation.

Aufbauend auf Henri Gourvest des (Autor des Delphi CEF-Wrapper) Beispiel aus this thread, können Sie in Delphi versuchen so etwas wie die folgenden Pseudo-Code:

uses 
    ceflib; 

function CreateField(const AValue: AnsiString): ICefPostDataElement; 
begin 
    Result := TCefPostDataElementRef.New; 
    Result.SetToBytes(Length(AValue), PAnsiChar(AValue)); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Header: ICefStringMultimap; 
    Data: ICefPostData; 
    Request: ICefRequest; 
begin 
    Header := TCefStringMultimapOwn.Create; 
    Header.Append('Content-Type', 'application/x-www-form-urlencoded'); 

    Data := TCefPostDataRef.New; 
    Data.AddElement(CreateField('Data.id=27')); 
    Data.AddElement(CreateField('&Data.title=title')); 
    Data.AddElement(CreateField('&Data.body=body')); 

    Request := TCefRequestRef.New; 
    Request.Flags := WUR_FLAG_NONE; 
    Request.Assign('http://example.com/', 'POST', Data, Header); 

    Chromium1.Browser.MainFrame.LoadRequest(Request); 
end; 

Das gleiche eine andere Version des obigen Code tun sollten :

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Header: ICefStringMultimap; 
    Data: ICefPostData; 
    Request: ICefRequest; 
begin 
    Request := TCefRequestRef.New; 
    Request.Url := 'http://example.com/'; 
    Request.Method := 'POST'; 
    Request.Flags := WUR_FLAG_NONE; 

    Header := TCefStringMultimapOwn.Create; 
    Header.Append('Content-Type', 'application/x-www-form-urlencoded'); 
    Request.SetHeaderMap(Header); 

    Data := TCefPostDataRef.New; 
    Data.AddElement(CreateField('Data.id=27')); 
    Data.AddElement(CreateField('&Data.title=title')); 
    Data.AddElement(CreateField('&Data.body=body')); 
    Request.PostData := Data; 

    Chromium1.Browser.MainFrame.LoadRequest(Request); 
end; 
+0

Große Antwort, danke! – Trevor

+0

Gut zu helfen ;-) – TLama

Verwandte Themen