python - 通过POST请求发送数据

标签 python python-3.x sockets http

我一段时间前一直在 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-Typemultipart/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/

相关文章:

linux - 当 recv buf 已经有数据时,tcp socket recv 会返回 "resource temporarily unavailable"

node.js - 如何访问 socket.io 连接内的 cookie 数据?

python - 如何在 Keras 模型中停用使用training=True 调用的 dropout 层?

python - 添加到 Viewbox 的 TextItem 在几秒钟后消失

python - 在 python 中控制 SSL 握手的模块?

Python sum 与 NumPy numpy.sum

python-3.x - 在 Virtualenvwrapper 中设置解释器

Coverity - 结构类型溢出

python - windows上virtualenv下安装flask失败--【错误2】系统找不到指定的文件

python - 使用值列表构建字符串