如果让我说清楚我不想使用更高级别的api,我只想使用socket编程
我已经编写了以下程序来使用POST请求连接到服务器。
import socket
import binascii
host = "localhost"
port = 9000
message = "POST /auth HTTP/1.1\r\n"
parameters = "userName=Ganesh&password=pass\r\n"
contentLength = "Content-Length: " + str(len(parameters))
contentType = "Content-Type: application/x-www-form-urlencoded\r\n"
finalMessage = message + contentLength + contentType + "\r\n"
finalMessage = finalMessage + parameters
finalMessage = binascii.a2b_qp(finalMessage)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.sendall(finalMessage)
print(s.recv(1024))
我在线查看了POST请求是如何创建的。
不知怎么的,参数没有传递到服务器。是否必须在请求之间添加或删除“\r\n”?
提前谢谢你, 当做, 甘尼什。
这一行
finalMessage = binascii.a2b_qp(finalMessage)
肯定是错误的,所以您应该完全删除该行,另一个问题是Content-Length
之后没有新行丢失。在这种情况下,发送到套接字的请求是(我将这里的CR
和LF
字符显示为\r\n
,但为了清晰起见,也会分割行):显然,这对web服务器没有多大意义。
但是,即使在添加新行并删除} ;对于HTTP/1.1,请求必须有一个
a2b_qp
之后,仍然存在的问题是,您不是那里的而不是talking ^{Host
头(RFC 2616 14.23):此外,您不支持分块请求和持久连接、keepalives或任何内容,因此必须执行
Connection: close
(RFC 2616 14.10):因此,如果没有
Host:
头,任何仍能正常响应消息的HTTP/1.1
服务器也会断开。这是您应该随该请求发送到套接字的数据:
注意,您将不再在主体中添加
\r\n
(因此主体29的长度)。此外,你应该阅读响应,找出你得到的错误是什么。在Python 3上,工作代码会说:
相关问题 更多 >
编程相关推荐