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

C++使用WinHttpSendRequest如何正确格式化请求头与请求体

WinHTTP POST请求返回400错误的修复方案

核心错误点

  • 请求头不符合HTTP规范:缺少Content-Type说明请求体格式,且单个请求头未以\r\n结尾,服务端无法正常解析请求头。
  • 请求体格式不标准:当前使用的key: value每行换行的格式不属于通用POST数据格式(既不是表单格式也不是JSON格式),服务端无法识别请求体内容。
  • 类型转换存在编码错误:Unicode编码环境下直接将CString强转为LPCSTR会导致内容乱码,服务端解析失败。
  • WinHttp参数传递不严谨:请求头长度手动计算容易出错,可能导致头截断。

修复步骤

  1. 先确认服务端接受的POST数据格式,目前通用格式有两种:
    • 表单格式:Content-Type: application/x-www-form-urlencoded,请求体格式为key1=value1&key2=value2
    • JSON格式:Content-Type: application/json,请求体格式为标准JSON字符串
  2. 按照规范构造请求头,每个头字段以\r\n结尾,必须包含Content-Type字段。
  3. 按照服务端要求构造请求体,使用对应编码(推荐UTF-8),避免强转导致乱码。
  4. 修正WinHttp调用参数,避免长度计算错误。

代码示例

场景1:服务端接受表单格式数据

构造请求头和请求体

// 构造请求头
CStringW header;
header.AppendFormat(L"__id: %s\r\n", GetID());
// 声明请求体为表单格式
header += L"Content-Type: application/x-www-form-urlencoded\r\n";

// 构造UTF-8编码的表单请求体,需自行实现URL编码处理特殊字符
CStringA body_builder;
body_builder.AppendFormat("name=%s&code=%s&type=%s", 
    UrlEncode(m_name).GetString(), 
    UrlEncode(m_code).GetString(), 
    UrlEncode(m_type).GetString());

// 调用接口,CStringA的GetLength返回的就是字节数,可直接作为body长度传入
response = SendPOSTRequest(m_postUri, header, body_builder.GetString(), body_builder.GetLength());

修正send_request函数中的WinHttp调用

将WinHttpSendRequest的请求头长度参数改为-1,让系统自动计算宽字符串长度,避免手动计算失误:

if (!WinHttpSendRequest(request.handle, headers.GetString(), -1, (LPVOID)body, body_length, body_length, 0))

场景2:服务端接受JSON格式数据

只需修改请求头的Content-Type和请求体构造逻辑即可:

// 构造请求头
CStringW header;
header.AppendFormat(L"__id: %s\r\n", GetID());
// 声明请求体为JSON格式
header += L"Content-Type: application/json;charset=utf-8\r\n";

// 构造UTF-8编码的JSON请求体,需自行实现JSON转义处理特殊字符
CStringA body_builder;
body_builder.AppendFormat("{\"name\":\"%s\",\"code\":\"%s\",\"type\":\"%s\"}", 
    EscapeJson(m_name).GetString(), 
    EscapeJson(m_code).GetString(), 
    EscapeJson(m_type).GetString());

// 调用接口逻辑和表单格式一致
response = SendPOSTRequest(m_postUri, header, body_builder.GetString(), body_builder.GetLength());

补充说明

  • URL编码和JSON转义逻辑可以直接使用MFC内置函数或自行实现,核心是避免特殊字符破坏请求体格式。
  • 如果服务端使用其他编码(如GBK),构造请求体时将内容转为对应编码即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:04