You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中TEdgeBrowser导航时如何获取POST数据?

获取TEdgeBrowser/WVBrowser中的POST请求数据

TEdgeBrowser(基于WebView2)和WVBrowser的NavigationStarting事件确实不提供POST请求体数据——WebView2的设计逻辑里,该事件仅负责导航启动的基础校验,请求体这类细节需要通过**WebResourceRequested**事件来捕获。

实现步骤

  1. 等待WebView2初始化完成
    必须在WebView2环境初始化完成后(比如TEdgeBrowser的CreateWebViewCompleted事件触发后)再注册资源监听事件,否则无法获取到CoreWebView2核心对象。

  2. 注册资源请求监听规则
    通过CoreWebView2.AddWebResourceRequestedFilter指定要监听的URL范围和请求类型(比如仅监听POST请求),再绑定WebResourceRequested事件。

  3. 读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:07:20