C++ 使用c+发送POST多部分/表单数据请求+;代码
我正在尝试编写一个客户端,它将连接到服务器并发出HTTP POST多部分/表单数据请求。请把下面的代码通读一遍。使用此代码,我不会得到任何错误响应。 我能得到一些回应,但不完全是我所期望的 通过这段代码,我可以访问URL,但我认为服务器没有读取参数(有效负载) 我不确定我是否通过了适当的有效载荷 请帮我写一个合适的有效载荷。谢谢C++ 使用c+发送POST多部分/表单数据请求+;代码,c++,http-post,multipartform-data,C++,Http Post,Multipartform Data,我正在尝试编写一个客户端,它将连接到服务器并发出HTTP POST多部分/表单数据请求。请把下面的代码通读一遍。使用此代码,我不会得到任何错误响应。 我能得到一些回应,但不完全是我所期望的 通过这段代码,我可以访问URL,但我认为服务器没有读取参数(有效负载) 我不确定我是否通过了适当的有效载荷 请帮我写一个合适的有效载荷。谢谢 void BuildHTTPRequest::BuildHeader1(stringstream &hdr,string payload) { hdr
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");
}
void BuildHTTPRequest::BuildHeader1(stringstream&hdr,字符串负载)
{
hdr您还应该在第一个有效负载数据之前有一个边界分隔符,因为您没有在多部分数据之前放置任何前导,所以您的请求头和有效负载之间需要2个CRLF
封装边界以CRLF开始的要求
意味着多部分实体的主体本身必须以
第一个封装行之前的CRLF——也就是说,如果“前导码”
如果未使用区域,则实体头必须后跟两个CRLF。
这确实是此类实体的组成方式
另外,为什么在分隔符的边界值之前使用两个以上的连字符
说明书上说:
多部分实体的内容类型字段需要一个参数,
“边界”,用于指定封装边界
封装边界定义为完全由两条线组成的线
连字符(“-”,十进制代码45),后跟边界
内容类型标题字段中的参数值
因此,典型的多部分内容类型头字段可能如下所示
这:
这表示实体由几个部分组成,每个部分本身都有一个
在语法上与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");
}
为什么要向BuildPayload1-函数传递一个指向有效负载字符串的指针?该字符串之前是否包含任何数据?否。字符串在此之前不包含任何数据。我按如下方式调用这些函数:BuildPayload1(&payload1);BuildHeader1(ss1,payload1);嗨,Eric,谢谢你的回复。我尝试了你建议的代码。它的输出是相同的。还有其他可能性吗?你确定你添加了所有表单字段吗?表单上有隐藏字段吗?除此之外,跟踪发送的内容和服务器响应的内容可能会给你一个提示。
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");
}