【问题标题】:HTTP POST mutli part "BAD REQUEST"HTTP POST 多部分“错误请求”
【发布时间】:2012-12-27 14:11:22
【问题描述】:

我正在尝试使用 POST 上传文件

这是我的要求:

POST /upload.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=---------------------------552335022525
Content-Length: 192
-----------------------------552335022525
Content-Disposition: form-data; name="userfile"; filename="12.txt"
Content-Type: text/plain


blabla
-----------------------------552335022525--

使用 HTTP live headers firefox 插件一切正常

但是当将它放入一个 char *buffer 并使用 winsocksapi 发送时,我得到 400 Bad Request 错误

【问题讨论】:

  • 你是怎么把它放到char*缓冲区的?
  • char *sendBuffer="整个事情";
  • 在使用send()的时候,有注意返回值吗? send() 可以发送比请求更少的字节,所以你必须循环它。此外,如果您使用的是阻塞套接字,您是否注意返回码,尤其是 WSAEWOULDBLOCK?请显示您的实际发送代码。顺便说一句,您在 Content-Length 标头和第一条边界线之间缺少所需的 CRLF。 HTTP 标头由 2 个 CRLF 终止。
  • @bit8bug,但字符常量中不能有换行符。这就是我想看到的。另外,您可以为您使用的语言添加标签吗?
  • @DarkFalcon:您可以在字符串常量中使用换行符,使用\r\n

标签: c http-headers http-post winsock


【解决方案1】:

您需要在标头和有效负载之间有一个空行。

Content-Length: 192

-----------------------------552335022525

这是 HTTP 协议的一部分。 HTTP 请求标头以第一个空行结尾(CR-LF 本身)。您发送的内容是字符串

-----------------------------552335022525

被(连同以下两行)作为请求标头,当然不是。服务器无法对此做出反应,因此它以 400 Bad Request 响应。

此外,使用 multipart/form-data 发送 Content-length 不是必需的,甚至不是一个好主意,因为错误的值可能会产生问题。 MIME 多部分格式是自我描述的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多