Как отправить данные и данные заголовка с помощью Chromium?

Я пытаюсь преобразовать некоторый код из TWebBrowser в Chromium, но мне трудно понять, как отправлять сообщения и данные заголовка с помощью HTTP-запроса.

Ниже приведена функция TWebBrowser, которую я пытаюсь реализовать.

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

Как сделать эквивалент с Chromium?

Ответ 1

Из-за отсутствующей документации для Delphi Chromium Embedded, я буду ссылаться на необходимые требования для отправки веб-запросов для CEF-версии CEF. Итак, вам нужно использовать метод LoadRequest для отправки запросов в Chromium. Для его использования вам понадобится экземпляр объекта CefRequest класса объектов запроса вместе с HeaderMap и CefPostData объекты для заголовка запроса и спецификации данных.

Расширение на Henri Gourvest (автор обертки Delphi CEF) из this thread, вы можете в Delphi попробовать что-то вроде следующего псевдо -код:

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;

То же самое должно сделать другая версия вышеуказанного кода:

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;