2012-10-19 30 views
10

Tôi đang cố chuyển đổi một số mã từ TWebBrowser sang Chromium nhưng gặp sự cố khi tìm cách gửi dữ liệu bài đăng và tiêu đề bằng yêu cầu HTTP.Làm cách nào để gửi dữ liệu bài đăng và tiêu đề bằng Chromium?

Dưới đây là chức năng TWebBrowser mà tôi đang cố triển khai.

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

Làm cách nào để làm tương đương với Chromium?

+0

trong chủ đề này có [ 'các example'] (https://groups.google.com/forum/?fromgroups=#!topic/delphichromiumembedded/r1_ytEvBHEs) của một yêu cầu POST do Delphi CEF wrapper tự tác giả. Nếu tôi sẽ đến Delphi và tìm một nơi để kiểm tra điều đó, tôi sẽ đăng bài này như là một câu trả lời (nếu ai đó sẽ không nhanh hơn :-) – TLama

+1

Cảm ơn bạn, tôi sẽ xem xét nó. – Trevor

+0

Vì vậy, tôi đã nhận nó làm việc .. (với TLama ví dụ của bạn) Tất cả ngoại trừ việc thêm dữ liệu tiêu đề .. Ứng dụng của tôi dường như chạy tốt mà không có nó (hoặc nó đã được thiết lập mặc định) .. Nhưng nếu có ai biết làm thế nào để làm điều đó với các dữ liệu tiêu đề, hoặc muốn vẫn trả lời tôi vẫn sẽ được quan tâm .. Hãy thoải mái để đặt liên kết đó là câu trả lời và tôi sẽ chấp nhận nó .. Cảm ơn! – Trevor

Trả lời

9

Do tài liệu bị thiếu cho Delphi Chromium Embedded, tôi sẽ tham khảo các yêu cầu cần thiết để gửi yêu cầu web cho phiên bản C++ của CEF. Vì vậy, bạn cần sử dụng phương thức LoadRequest để gửi yêu cầu trong Chromium. Để sử dụng nó, bạn cần thể hiện đối tượng của lớp đối tượng yêu cầu CefRequest cùng với các đối tượng HeaderMapCefPostData cho tiêu đề yêu cầu và đặc tả dữ liệu.

Mở rộng trên Henri Gourvest của (tác giả của wrapper Delphi CEF) ví dụ từ this thread, bạn có thể trong Delphi thử một cái gì đó giống như pseudo-code sau:

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; 

Cùng nên làm một phiên bản khác của các mã trên :

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

Câu trả lời hay, cảm ơn! – Trevor

+0

Vui mừng được trợ giúp ;-) – TLama

Các vấn đề liên quan