使用c++代码发送POST多部分/表单数据请求

Sending POST multipart/form-data request using c++ code

本文关键字:表单 数据 请求 多部 POST c++ 代码 使用      更新时间:2023-10-16

我正在尝试编写一个客户端,它将连接到服务器并发出HTTPPOST多部分/表单数据请求。请检查以下代码。使用此代码,我不会得到任何错误响应。我能得到一些回应,但并不完全是我所期望的。

有了这段代码,我可以访问URL,但我认为服务器没有读取参数(有效负载)。

我不确定我是否通过了适当的有效载荷。

请帮我写一个合适的有效载荷。谢谢

void BuildHTTPRequest::BuildHeader1(stringstream &hdr,string payload)
{
hdr << "POST /home/one/user/send_event HTTP/1.1rn";
hdr << "Host:host.domain.comrn";
hdr << "Port:80rn";
hdr << "Content-Type:multipart/form-data; boundary=463762444806rn";
hdr << "Content-Length:" << payload.size() << "rn";
hdr << "rn";
hdr << payload;
}
void BuildHTTPRequest::BuildPayload1(string *payload)
{
(*payload).append("Content-Disposition: form-data; name="interface_version"rnrn");
(*payload).append("01.0.01rn");
(*payload).append("-----------------------------463762444806rn");
(*payload).append("Content-Disposition: form-data; name="terminal_id"rnrn");
(*payload).append("1rn");
(*payload).append("-----------------------------463762444806rn");
(*payload).append("Content-Disposition: form-data; name="device"rnrn");
(*payload).append("displayrn");
(*payload).append("-----------------------------463762444806rn");
(*payload).append("Content-Disposition: form-data; name="start_session"rnrn");
(*payload).append("truern");
(*payload).append("-----------------------------463762444806rn");
(*payload).append("Content-Disposition: form-data; name="first_contact"rnrn");
(*payload).append("truern");
(*payload).append("-----------------------------463762444806--rnrn");
}

您还应该在第一个有效负载数据之前有一个边界分隔符,并且由于您没有在多部分数据之前放置任何前导码,因此您的请求标头和有效负载之间需要2个CRLF。

封装边界以CRLF开始的要求意味着多部分实体的主体本身必须以CRLF在第一条封装线之前——也就是说,如果"前导码"区域,实体标头后面必须跟两个CRLF。这确实是这些实体的组成方式。

此外,为什么在分隔符的边界值之前使用两个以上的连字符?

Specs表示:

多部分实体的内容类型字段需要一个参数,"边界",用于指定封装边界。这个封装边界被定义为一条完全由两条线组成的线后跟边界的连字符("-",十进制代码45)"内容类型"标头字段中的参数值。

因此,一个典型的多部分Content-Type头字段可能看起来像这个:

Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p   

这表明实体由几个部分组成,每个部分本身都有一个结构语法上与RFC 822消息相同,只是报头区域可能完全为空,并且每个部分都在前面按线路

--gc0p4Jq0M2Yt08jU534c0p

试试这个:

void BuildHTTPRequest::BuildPayload1(string *payload)
{
(*payload).append("rn--463762444806rn");
(*payload).append("Content-Disposition: form-data; name="interface_version"rnrn");
(*payload).append("01.0.01rn");
(*payload).append("--463762444806rn");
(*payload).append("Content-Disposition: form-data; name="terminal_id"rnrn");
(*payload).append("1rn");
(*payload).append("--463762444806rn");
(*payload).append("Content-Disposition: form-data; name="device"rnrn");
(*payload).append("displayrn");
(*payload).append("--463762444806rn");
(*payload).append("Content-Disposition: form-data; name="start_session"rnrn");
(*payload).append("truern");
(*payload).append("--463762444806rn");
(*payload).append("Content-Disposition: form-data; name="first_contact"rnrn");
(*payload).append("truern");
(*payload).append("--463762444806--rnrn");
}