C++使用WinHttpSendRequest如何正确格式化请求头与请求体
WinHTTP POST请求返回400错误的修复方案
核心错误点
- 请求头不符合HTTP规范:缺少
Content-Type说明请求体格式,且单个请求头未以\r\n结尾,服务端无法正常解析请求头。 - 请求体格式不标准:当前使用的
key: value每行换行的格式不属于通用POST数据格式(既不是表单格式也不是JSON格式),服务端无法识别请求体内容。 - 类型转换存在编码错误:Unicode编码环境下直接将
CString强转为LPCSTR会导致内容乱码,服务端解析失败。 - WinHttp参数传递不严谨:请求头长度手动计算容易出错,可能导致头截断。
修复步骤
- 先确认服务端接受的POST数据格式,目前通用格式有两种:
- 表单格式:
Content-Type: application/x-www-form-urlencoded,请求体格式为key1=value1&key2=value2 - JSON格式:
Content-Type: application/json,请求体格式为标准JSON字符串
- 表单格式:
- 按照规范构造请求头,每个头字段以
\r\n结尾,必须包含Content-Type字段。 - 按照服务端要求构造请求体,使用对应编码(推荐UTF-8),避免强转导致乱码。
- 修正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
相关产品推荐
相关产品推荐

