我正在尝试将一些代码从
TWebBrowser
转换为使用 TEdgeBrowser
,但我无法弄清楚如何使用 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);
如何使用
TEdgeBrowser
或在 TWebBrowser
中使用 SelectedEngine := EdgeOnly
进行等效操作?
我已经在c++builder中完成了,将其传递给delphi一定很容易。
从 TEdgeBrowser 中,您需要接口 _di_ICoreWebView2 ,然后从 _di_ICoreWebView2 接口 ICoreWebView2_2a ,从 ICoreWebView2_2 接口 _di_ICoreWebView2Environment ,然后通过强制转换 _di_ICoreWebView2Environment2
我在 EdgeBrowserCreateWebViewCompleted 事件上创建所有这些接口(因为我用 new 动态创建 TEdgeBrowser,它还没有准备好,所以我需要该事件)。
您必须创建资源并浏览到该资源(就像我在这里所做的那样):
_di_ICoreWebView2WebResourceRequest Request;
TMemoryStream *ms=new TMemoryStream();
TStreamAdapter *stra=new TStreamAdapter (ms,soReference);
ms->Write(Post.c_str(),strlen(Post.c_str()));
CurrentBrowser->env2->CreateWebResourceRequest(URL.c_bstr(),L"POST",stra->operator _di_IStream(),WideString("Content-Type: application/x-www-form-urlencoded\r\n").c_bstr(),Request);
if(Request)
EdgeBrowser->NavigateWithWebResourceRequest(Request);
然后内容标头类型是在服务器中接收信息作为 POST 变量。
您创建一个 TStreamAdapter 来生成一个抽象的 _di_IStream ,无法直接实例化(这对我来说是更难找到的事情)
恢复的接口步骤如下:
_di_ICoreWebView2 Core2;
ICoreWebView2_2 *Core2_2;
_di_ICoreWebView2Environment env;
_di_ICoreWebView2Environment2 env2;
if(EdgeBrowser->ControllerInterface)
{
EdgeBrowser->ControllerInterface->Get_CoreWebView2(Core2);
if(Core2)
{
Core2->QueryInterface(IID_ICoreWebView2_2, (void **)&Core2_2);
if(Core2_2)
{
Core2_2->Get_Environment(env);
env2=env;
}
}
}