C++实现HTTP/2 POST请求遭拒,返回505错误求助
问题:C++模拟Binance API POST请求失败,返回505错误
目标Curl命令
需要模拟的Curl命令:
curl -H "X-MBX-APIKEY: dummy_one" -X POST 'https://api.binance.com/api/v3/order?hello'
Curl的正常响应与请求日志
该Curl请求的响应:
{"code":-2014,"msg":"API-key format invalid."}
Curl verbose日志显示的发送内容:
> POST /api/v3/order?hello HTTP/2 > Host: api.binance.com > user-agent: curl/7.81.0 > accept: */* > x-mbx-apikey: dummy_one >
我的C++实现代码
编写的C++代码片段:
char* write_buf = "POST /api/v3/order HTTP/2\r\n" "Host: api.binance.com\r\n" "user-agent: curl/7.81.0\r\n" "accept: */*\r\n" "X-MBX-APIKEY: dummy_one\r\n" "content-length: 5\r\n" "content-type: application/x-www-form-urlencoded\r\n" "hello"; if(BIO_write(bio, write_buf, strlen(write_buf)) <= 0) { // 错误处理代码 }
遇到的问题
请求被拒绝,返回:
HTTP/1.1 505 HTTP Version Not Supported
猜测可能和未转义空格有关,但不确定具体问题。SSL连接正常,GET请求可正常运行,问题应该出在POST请求的格式上。
问题分析与修正方案
你的代码存在几个关键格式错误,导致服务器无法正确解析请求:
请求行缺失查询参数
Curl请求行是POST /api/v3/order?hello HTTP/2,但你的代码里写的是POST /api/v3/order HTTP/2,漏掉了?hello查询参数,请求路径不匹配。请求头与请求体的分隔错误
HTTP协议要求所有请求头结束后必须加一个空行(\r\n\r\n),用来分隔请求头和请求体。你的代码写完最后一个请求头后直接接了hello,没有这个空行,服务器无法识别头和体的边界。多余且错误的请求头设置
目标Curl请求没有发送任何请求体,所以不需要content-length和content-type这两个头,多余的头会干扰服务器解析;同时你设置的content-length:5和实际内容也不匹配。HTTP版本兼容性问题
505错误也可能是因为服务器不支持HTTP/2,可尝试将请求行中的HTTP/2改为HTTP/1.1。
修正后的代码示例
char* write_buf = "POST /api/v3/order?hello HTTP/1.1\r\n" "Host: api.binance.com\r\n" "user-agent: curl/7.81.0\r\n" "accept: */*\r\n" "X-MBX-APIKEY: dummy_one\r\n" "\r\n"; // 空行分隔请求头与请求体(无请求体时仅需空行) if(BIO_write(bio, write_buf, strlen(write_buf)) <= 0) { // 错误处理代码 }
额外说明
如果后续需要发送请求体,需确保:
- 请求头结束后必须添加
\r\n\r\n Content-Length的值严格等于请求体的字节数- 根据请求体类型正确设置
Content-Type
内容的提问来源于stack exchange,提问作者bicoi77
相关产品推荐
相关产品推荐

