2012-10-19 1 views
10

Je tente de convertir du code de TWebBrowser en Chrome mais je n'arrive pas à trouver comment envoyer des données de post et d'en-tête avec une requête HTTP.Comment envoyer des données de publication et d'en-tête avec Chromium?

Voici la fonctionnalité TWebBrowser que j'essaie de mettre en œuvre.

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

Comment faire l'équivalent avec Chromium?

+0

Dans ce fil, il y a [ 'la example'] (https://groups.google.com/forum/?fromgroups=#!topic/delphichromiumembedded/r1_ytEvBHEs) d'une requête POST faite par emballage Delphi CEF auteur lui-même. Si j'arrive à Delphi et trouve un endroit pour tester ça, je posterai ceci comme réponse (si quelqu'un ne sera pas plus rapide :-) – TLama

+1

Merci, je vais m'y pencher. – Trevor

+0

Donc je l'ai eu le travail .. (avec votre exemple TLama) Tout sauf pour ajouter les données d'en-tête .. Mon application semble bien fonctionner sans elle (ou c'est déjà réglé par défaut) .. Mais si quelqu'un sait comment le faire les données d'en-tête, ou veut encore répondre je serais toujours intéressé .. N'hésitez pas à mettre ce lien comme la réponse et je vais l'accepter .. Merci! – Trevor

Répondre

9

En raison d'une documentation manquante pour Delphi Chromium Embedded, je ferai référence aux exigences requises pour l'envoi de requêtes Web pour la version C++ de CEF. Donc, vous devez utiliser la méthode LoadRequest pour envoyer des requêtes dans Chromium. Pour l'utiliser, vous avez besoin de l'instance d'objet de la classe d'objet de requête CefRequest avec les objets HeaderMap et CefPostData pour l'en-tête de requête et la spécification de données.

Développant Henri Gourvest (auteur de l'emballage CEF Delphi) exemple de this thread, vous pouvez à Delphes essayer quelque chose comme le pseudo-code suivant:

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; 

La même chose devrait faire une autre version du code ci-dessus :

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

Bonne réponse, merci! – Trevor

+0

Content de vous aider ;-) – TLama

Questions connexes