2012-10-19 13 views
10

Sto tentando di convertire un codice da TWebBrowser a Chromium ma sto avendo problemi a capire come inviare i dati di post e header con una richiesta HTTP.Come posso inviare dati di post e header con Chromium?

Di seguito è riportata la funzionalità TWebBrowser che sto tentando di implementare.

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

Come si esegue l'equivalente con Chromium?

+0

In questa discussione c'è [ 'l'example'] (https://groups.google.com/forum/?fromgroups=#!topic/delphichromiumembedded/r1_ytEvBHEs) di una richiesta POST fatta da Delphi CEF involucro autore stesso. Se arriverò a Delphi e troverò un posto per testarlo, lo posterò come risposta (se qualcuno non sarà più veloce :-) – TLama

+1

Grazie, lo esaminerò. – Trevor

+0

Quindi ho funzionato .. (con il tuo esempio TLama) Tutti tranne per aggiungere i dati dell'intestazione .. La mia applicazione sembra funzionare senza di essa (o è già impostata di default) .. Ma se qualcuno sa come farlo con i dati di intestazione, o vuole ancora rispondere sarei ancora interessato .. Sentiti libero di mettere quel link come risposta e lo accetto .. Grazie! – Trevor

risposta

9

A causa di una documentazione mancante per Delphi Chromium Embedded, farò riferimento ai requisiti necessari per l'invio di richieste Web per la versione C++ di CEF. Pertanto, devi utilizzare il metodo LoadRequest per l'invio di richieste in Chromium. Per utilizzarlo, è necessario l'istanza dell'oggetto della classe dell'oggetto di richiesta CefRequest insieme agli oggetti HeaderMap e CefPostData per l'intestazione della richiesta e la specifica dei dati.

Ampliando di Henri Gourvest (autore del wrapper Delphi CEF) esempio dalla this thread, si può a Delfi provare qualcosa di simile al seguente pseudo-codice:

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; 

Lo stesso dovrebbe fare un'altra versione del codice di cui sopra :

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

Ottima risposta, grazie! – Trevor

+0

Felice di aiutare ;-) – TLama

Problemi correlati