使用c ++代码发送POST multipart / form-data请求

时间:2014-01-09 10:24:10

标签: c++ http-post multipartform-data

我正在尝试编写一个客户端,它将连接到服务器并发出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");
}

1 个答案:

答案 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");
}