我一段时间前一直在 Python 中使用套接字,我试图理解为什么这个应该在字段 data1 和 data2 上发送一些数据的 POST 不起作用。
POST/method.php HTTP/1.1\r\n主机:localhost\r\n内容类型:multipart/form-data\r\n\r\ndata1=something&data2= otherthing\r\n\r\n
这个请求有什么问题吗?
最佳答案
您的请求有几个问题:
POST /method.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data
data1=something&data2= otherthing
首先,每当在 HTTP 请求中使用主体时,必须知道主体的长度。这通常是通过在 HTTP header 中通过 Content-length
预先给出长度来完成的,尽管如果预先未知完整长度,也可以使用分块编码。您的请求没有执行任何这些操作,这意味着该请求是无效的 HTTP 请求。
此外,您声明 Content-Type
为 multipart/form-data
,尽管您的正文不属于这种类型。使用 multipart/form-data
,您的正文将由多个由文本边界分隔的 MIME 部分组成,并且需要在您的 Content-type
header 中声明此边界。您显示的正文的正确类型应该是 application/x-www-form-urlencoded
。
即使使用 application/x-www-form-urlencoded
,正文也有部分错误。这种类型的正文应该只是由 &
连接的 key=value
对,即键后面不应该像 data2=< 之后那样有空格
也不应该像您那样在数据末尾添加新行。
当消除所有这些问题时,您可能应该发送以下请求:
body = "data1=something&data2=otherthing"
request = ("POST /method.php HTTP/1.1\r\n" + \
"Host: localhost\r\n" + \
"Content-Type: application/x-www-form-urlencoded\r\n" + \
"Content-Length: %d\r\n" + \
"\r\n%s") % (len(body),body)
但是,一旦您发送了此请求,问题就会继续存在,因为正确获取响应也很复杂。一般来说,我建议不要编写自己的 HTTP 处理代码,除非您真的知道自己在做什么,而是使用现有的库。虽然仅查看几个示例请求时 HTTP 可能看起来很简单,但它比最初看起来要复杂得多。虽然您的代码似乎可以在特定服务器上运行,但在其他服务器上可能会失败。
关于python - 通过POST请求发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50243235/