2012-10-19 10 views
10

Próbuję przekonwertować kod z TWebBrowser na Chromium, ale mam problem z ustaleniem sposobu wysyłania danych postów i nagłówków za pomocą żądania HTTP.Jak wysłać dane dotyczące postów i nagłówków za pomocą Chromium?

Poniżej znajduje się funkcja TWebBrowser, którą próbuję zaimplementować.

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); 

Jak zrobić ekwiwalent z chromem?

+0

W wątku jest [ 'example'] (https://groups.google.com/forum/?fromgroups=#!topic/delphichromiumembedded/r1_ytEvBHEs) żądania słupek z Delphi CEF opakowaniu sam autor. Jeśli dostanę się do Delphi i znajdę miejsce do przetestowania tego, opublikuję to jako odpowiedź (jeśli ktoś nie będzie szybszy :-) – TLama

+1

Dziękuję, zagłębię się w to. – Trevor

+0

Więc mam to działa .. (z twoim przykładem TLama) Wszystko z wyjątkiem dodawania danych nagłówka .. Moja aplikacja wydaje się działać bez niego (lub jest już ustawiona domyślnie) .. Ale jeśli ktoś wie jak to zrobić z dane nagłówka, lub chce nadal odpowiadać, nadal byłbym zainteresowany. Możesz umieścić ten link jako odpowiedź, a ja to zaakceptuję. Dzięki! – Trevor

Odpowiedz

9

Z powodu braku dokumentacji dla Delphi Chromium Embedded, odniosę się do potrzebnych wymagań dotyczących wysyłania żądań internetowych dla wersji C++ C++. Musisz więc użyć metody LoadRequest do wysyłania żądań w Chromium. Aby go użyć, potrzebna jest instancja obiektu klasy obiektu żądania żądania CefRequest wraz z obiektami HeaderMap i CefPostData dla nagłówka żądania i specyfikacji danych.

Rozszerzając Henri Gourvest za (autor owijki Delphi CEF) przykład z this thread można w Delphi spróbować czegoś podobnego poniższym pseudo-kod:

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; 

To samo należy zrobić kolejną wersję powyższego kodu :

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

Świetna odpowiedź, dzięki! – Trevor

+0

Cieszę się, że mogę Ci pomóc ;-) – TLama