我正在尝试编写一个客户端,它将连接到服务器并发出HTTP POST multipart / form-data请求。请仔细阅读以下代码。使用此代码,我没有得到任何错误响应。 我能得到一些回应,但不完全是我所做的。
使用此代码我可以访问URL,但我认为服务器没有读取参数(有效负载)。
我不确定我是否通过了适当的有效载荷。
请帮我写一个合适的有效载荷。感谢。
void BuildHTTPRequest::BuildHeader1(stringstream &hdr,string payload)
{
hdr << "POST /home/one/user/send_event HTTP/1.1\r\n";
hdr << "Host:host.domain.com\r\n";
hdr << "Port:80\r\n";
hdr << "Content-Type:multipart/form-data; boundary=463762444806\r\n";
hdr << "Content-Length:" << payload.size() << "\r\n";
hdr << "\r\n";
hdr << payload;
}
void BuildHTTPRequest::BuildPayload1(string *payload)
{
(*payload).append("Content-Disposition: form-data; name=\"interface_version\"\r\n\r\n");
(*payload).append("01.0.01\r\n");
(*payload).append("-----------------------------463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"terminal_id\"\r\n\r\n");
(*payload).append("1\r\n");
(*payload).append("-----------------------------463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"device\"\r\n\r\n");
(*payload).append("display\r\n");
(*payload).append("-----------------------------463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"start_session\"\r\n\r\n");
(*payload).append("true\r\n");
(*payload).append("-----------------------------463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"first_contact\"\r\n\r\n");
(*payload).append("true\r\n");
(*payload).append("-----------------------------463762444806--\r\n\r\n");
}
答案 0 :(得分:0)
您还应该在第一个有效负载数据之前有一个边界定界符,并且因为您没有在多部分数据之前放置任何前导码,所以在请求标头和有效负载之间需要2个CRLF。
封装边界以CRLF开头的要求 意味着多部分实体的主体必须以a开头 第一个封装行之前的CRLF - 也就是说,如果是“前导码” 如果未使用area,则实体头必须后跟两个CRLF。 这确实应该如何组成这样的实体。
另外,为什么在分界符的边界值之前使用2个以上的连字符?
规格说:
多部分实体的Content-Type字段需要一个参数, “boundary”,用于指定封装边界。该 封装边界定义为完全由两个组成的线 连字符(“ - ”,十进制代码45)后跟边界 Content-Type标头字段中的参数值。
...
因此,典型的multipart Content-Type标头字段可能看起来像 这样:
Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p
这表明该实体由几个部分组成,每个部分本身都有一个结构 在语法上与RFC 822消息相同,但标题除外 区域可能是完全空的,并且每个部分都在前面 按行
--gc0p4Jq0M2Yt08jU534c0p
请改为尝试:
void BuildHTTPRequest::BuildPayload1(string *payload)
{
(*payload).append("\r\n--463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"interface_version\"\r\n\r\n");
(*payload).append("01.0.01\r\n");
(*payload).append("--463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"terminal_id\"\r\n\r\n");
(*payload).append("1\r\n");
(*payload).append("--463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"device\"\r\n\r\n");
(*payload).append("display\r\n");
(*payload).append("--463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"start_session\"\r\n\r\n");
(*payload).append("true\r\n");
(*payload).append("--463762444806\r\n");
(*payload).append("Content-Disposition: form-data; name=\"first_contact\"\r\n\r\n");
(*payload).append("true\r\n");
(*payload).append("--463762444806--\r\n\r\n");
}