Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c+发送POST多部分/表单数据请求+;代码_C++_Http Post_Multipartform Data - Fatal编程技术网

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

C++ 使用c+发送POST多部分/表单数据请求+;代码,c++,http-post,multipartform-data,C++,Http Post,Multipartform Data,我正在尝试编写一个客户端,它将连接到服务器并发出HTTP POST多部分/表单数据请求。请把下面的代码通读一遍。使用此代码,我不会得到任何错误响应。 我能得到一些回应,但不完全是我所期望的 通过这段代码,我可以访问URL,但我认为服务器没有读取参数(有效负载) 我不确定我是否通过了适当的有效载荷 请帮我写一个合适的有效载荷。谢谢 void BuildHTTPRequest::BuildHeader1(stringstream &hdr,string payload) { hdr

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

通过这段代码,我可以访问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");
}
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");
}