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

求CefSharp/ChromiumWebBrowser HTTP POST请求完整可用示例

CefSharp/ChromiumWebBrowser 发送HTTP POST请求的完整实现示例

我刚好之前也踩过这个坑,CefSharp里发送POST请求确实有两种常用方式,对应你纠结的Navigate函数和自定义处理器两种方案,下面给你针对对接PHP脚本的完整可运行示例:


方案一:直接使用Navigate重载(适合简单场景)

这是最直接的方式,适合不需要拦截请求、只是单纯发送POST数据的场景,完全能满足你对接PHP脚本的需求。

C# 代码示例(WinForms/WPF通用)

using CefSharp;
using System.Text;

// 假设你的ChromiumWebBrowser实例名为browser
var phpUrl = "http://localhost/your-script.php"; // 替换成你的PHP脚本地址

// 构造POST表单数据,格式为key1=value1&key2=value2
var postData = "data1=your-input-1&data2=your-input-2"; // 这里可以替换成用户输入的实际值
var postBytes = Encoding.UTF8.GetBytes(postData);

// 构造POST请求的额外头信息,指定Content-Type
var headers = new Dictionary<string, string>
{
    {"Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"}
};

// 调用Navigate的POST重载
browser.Navigate(phpUrl, headers, postBytes, "POST");

对应的PHP脚本示例

<?php
// 设置返回JSON格式的响应头
header('Content-Type: application/json');

// 获取POST参数
$data1 = $_POST['data1'] ?? '';
$data2 = $_POST['data2'] ?? '';

// 你的匹配逻辑
if ($data1 === 'expected-value-1' && $data2 === 'expected-value-2') {
    echo json_encode(['status' => 'success']);
} else {
    echo json_encode(['status' => 'failure']);
}
?>

方案二:自定义RequestHandler(适合复杂场景)

如果需要动态修改请求、拦截请求或者更精细地控制POST数据,就需要实现IRequestHandler接口,覆写OnBeforeResourceLoad方法来修改请求的Method和PostData。

C# 代码示例

首先创建自定义的RequestHandler:

using CefSharp;
using System.Text;

public class CustomRequestHandler : IRequestHandler
{
    // 只处理目标PHP脚本的请求
    public bool OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
    {
        if (request.Url.StartsWith("http://localhost/your-script.php"))
        {
            // 修改请求方法为POST
            request.Method = "POST";
            
            // 构造POST数据
            var postDataString = "data1=user-input-1&data2=user-input-2";
            var postDataBytes = Encoding.UTF8.GetBytes(postDataString);
            
            // 创建PostData对象并绑定到请求
            var postData = PostData.Create();
            var element = PostDataElement.Create();
            element.Bytes = postDataBytes;
            postData.AddElement(element);
            request.PostData = postData;
            
            // 设置Content-Type头
            request.Headers.SetHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        }
        
        return false; // 返回false表示继续加载请求
    }

    // 其他IRequestHandler接口方法的默认实现
    public bool OnOpenUrlFromTab(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
    {
        return false;
    }

    public void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
    {
    }

    public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
    {
        return false;
    }

    // 剩余接口方法可按需补充,或保持默认空实现
}

然后在初始化ChromiumWebBrowser时绑定这个Handler:

// 初始化Cef(如果还没初始化的话)
Cef.Initialize(new CefSettings());

// 创建浏览器实例并绑定自定义RequestHandler
var browser = new ChromiumWebBrowser("about:blank");
browser.RequestHandler = new CustomRequestHandler();

// 导航到你的PHP脚本,RequestHandler会自动修改请求为POST
browser.Navigate("http://localhost/your-script.php");

关键注意点

  • 不管用哪种方式,一定要设置正确的Content-Type头,否则PHP的$_POST无法正确获取到参数;
  • POST数据的编码要统一,示例中用的是UTF-8,PHP脚本也要确保用UTF-8编码;
  • 如果是发送JSON格式的POST数据,只需要把Content-Type改成application/json,POST数据换成JSON字符串,PHP那边用file_get_contents('php://input')获取即可。

内容的提问来源于stack exchange,提问作者cobra8086

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:31:17