首页 > 解决方案 > 使用 WebView/EdgeHTML 发送 POST 请求

问题描述

我目前正在尝试根据以下答案使 EdgeHTML/WebView 工作:Using WebView (EdgeHTML) in Delphi / C++ Builder

复制代码并运行它就可以了。

但是现在我正在尝试添加“NavigateWithHttpRequestMessage”过程,以便我可以发送 POST 请求并且必须意识到我不知道我应该如何为其参数创建对象。

这是该过程的描述: https ://docs.microsoft.com/en-us/uwp/api/windows.web.ui.iwebviewcontrol.navigatewithhttprequestmessage

它告诉我参数的类型是“HttpRequestMessage”。

我已经下载了 Windows 10 工具包,并在里面找到了 Windows.Web.Http.idl 和“HttpRequestMessage”的这个接口:

[exclusiveto(Windows.Web.Http.HttpRequestMessage)]
[uuid(F5762B3C-74D4-4811-B5DC-9F8B4E2F9ABF)]
interface IHttpRequestMessage : IInspectable
{
[propget] HRESULT Content([out] [retval] Windows.Web.Http.IHttpContent** value);
[propput] HRESULT Content([in] Windows.Web.Http.IHttpContent* value);
[propget] HRESULT Headers([out] [retval] Windows.Web.Http.Headers.HttpRequestHeaderCollection** value);
[propget] HRESULT Method([out] [retval] Windows.Web.Http.HttpMethod** value);
[propput] HRESULT Method([in] Windows.Web.Http.HttpMethod* value);
[propget] HRESULT Properties([out] [retval] Windows.Foundation.Collections.IMap<HSTRING, IInspectable*>** value);
[propget] HRESULT RequestUri([out] [retval] Windows.Foundation.Uri** value);
[propput] HRESULT RequestUri([in] Windows.Foundation.Uri* value);
[propget] HRESULT TransportInformation([out] [retval] Windows.Web.Http.HttpTransportInformation** value);
}

我可以将其转换为 Delphi 中的接口,就像 NineBerry 对上面链接中的其他接口所做的那样。(或者至少使用虚拟程序。还不确定参数的类型。)

但是如何从中创建一个对象,以便可以将它与“NavigateWithHttpRequestMessage”过程一起使用?

任何帮助甚至指向正确方向的指示都将不胜感激。

标签: delphiwebviewmicrosoft-edge

解决方案


如果您已经对接口有所了解,答案就相当简单。但我最终还是弄清楚了:

根据标题或 .idl 所说的内容创建您的界面:

[WinRTClassNameAttribute('Windows.Web.Http.HttpRequestMessage')]
IHttpRequestMessage = interface(IInspectable)
['{F5762B3C-74D4-4811-B5DC-9F8B4E2F9ABF}']
  procedure Placeholder_ContentGet; safecall;
  procedure Placeholder_ContentPut; safecall;
  procedure Placeholder_HeadersGet; safecall;
  procedure Placeholder_MethodGet; safecall;
  procedure put_Method(value:IHttpMethod); safecall;
  procedure Placeholder_PropertiesGet; safecall;
  procedure Placeholder_RequestUriGet; safecall;
  procedure put_RequestUri(source: IUriRuntimeClass); safecall;
  procedure Placeholder_TransportInformationGet; safecall;
end;

然后在它下面添加一个 CoClass:

THttpRequestMessage = class(TWinRTGenericImportI<IHttpRequestMessage>)
end;

然后可以这样使用:

procedure TForm1.Button1Click(Sender: TObject);
var
  req: IHttpRequestMessage;
begin
  req := THttpRequestMessage.Create;
end;

推荐阅读