Delphi中TEdgeBrowser导航时如何获取POST数据?
获取TEdgeBrowser/WVBrowser中的POST请求数据
TEdgeBrowser(基于WebView2)和WVBrowser的NavigationStarting事件确实不提供POST请求体数据——WebView2的设计逻辑里,该事件仅负责导航启动的基础校验,请求体这类细节需要通过**WebResourceRequested**事件来捕获。
实现步骤
等待WebView2初始化完成
必须在WebView2环境初始化完成后(比如TEdgeBrowser的CreateWebViewCompleted事件触发后)再注册资源监听事件,否则无法获取到CoreWebView2核心对象。注册资源请求监听规则
通过CoreWebView2.AddWebResourceRequestedFilter指定要监听的URL范围和请求类型(比如仅监听POST请求),再绑定WebResourceRequested事件。读取POST请求体内容
事件参数中的Request是ICoreWebView2WebResourceRequest接口,其Content属性为IStream类型,需要将这个流转换为字符串后,再解析其中的XML内容。
Delphi代码示例
procedure TForm1.EdgeBrowserCreateWebViewCompleted(Sender: TObject; const AResult: HResult); begin if Succeeded(AResult) then begin // 启用资源请求监听功能 EdgeBrowser.CoreWebView2.Settings.IsWebResourceEnabled := True; // 添加过滤规则:监听所有URL的POST请求 EdgeBrowser.CoreWebView2.AddWebResourceRequestedFilter('*', COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL); // 绑定WebResourceRequested事件 EdgeBrowser.CoreWebView2.WebResourceRequested := CoreWebView2WebResourceRequestedEventHandler; end; end; procedure TForm1.CoreWebView2WebResourceRequestedEventHandler( const Sender: ICoreWebView2; const Args: ICoreWebView2WebResourceRequestedEventArgs); var LRequest: ICoreWebView2WebResourceRequest; LStream: IStream; LBuffer: array[0..4095] of Byte; LBytesRead: DWORD; LContent: TStringStream; LPostData: string; begin Args.get_Request(LRequest); // 仅处理POST类型的请求 if SameText(LRequest.Method, 'POST') then begin LContent := TStringStream.Create('', TEncoding.UTF8); try LRequest.get_Content(LStream); if Assigned(LStream) then begin // 重置流指针到起始位置,避免读取空内容 LStream.Seek(0, STREAM_SEEK_SET, nil); // 循环读取流数据 while LStream.Read(@LBuffer, SizeOf(LBuffer), LBytesRead) = S_OK do begin if LBytesRead > 0 then LContent.WriteBuffer(LBuffer, LBytesRead); end; LPostData := LContent.DataString; // 此处可解析LPostData中的XML内容,例如调用自定义解析函数 // ParseTargetXML(LPostData); end; finally LContent.Free; end; end; end;
注意事项
- 如果只需要监听特定域名或路径的POST请求,修改
AddWebResourceRequestedFilter的第一个参数即可(比如'https://your-target-domain.com/*')。 - 重定向场景下,可通过
LRequest.Uri判断是否为目标重定向URL,避免捕获无关POST请求。 - 处理
IStream时必须先调用Seek重置位置,否则可能读取到空内容。
内容的提问来源于stack exchange,提问作者TJ Asher
相关产品推荐
相关产品推荐

