我看到一些例子,人们从主机和端口创建socket对象,然后还发送GET请求,并在http请求中包含主机头
import socket
HOST = 'daring.cwi.nl'
PORT = 80
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall("GET / HTTP/1.1\r\n\r\nHost: daring.cwi.nl")
data = s.recv(1024)
print('Received', repr(data))
为什么我们需要提供一次主机来创建socket对象,然后再发送请求
首先,如果您只使用一个普通的tcp连接,您可以发送任何您想要的东西,您可以
s.sendall("HAHAHA")
其次,在您的代码中,它模拟了一个
Get
http请求。要发送参数,只需在url之后连接它们/?parameter1=value1¶meter2=value2
最后,为什么我们需要再次包含
Host
?假设您正在将此请求发送到负载平衡服务器,如果您不显式地发送它,应用程序服务器将无法获得真正的Host
Host
头是HTTP标准(至少版本1.1)所必需的,即定义与web服务器所说协议的标准。这样做的原因是,您可以让多个域共享同一IP地址,因此web服务器需要找出您要访问的域。由于较低层(即TCP)不包含此信息,而只包含在应用层(即HTTP)提供此信息所需的IP地址至于在
connect
中使用主机名:这实际上是不需要的,您也可以在那里提供IP地址。当提供主机名而不是IP时,它所做的就是查找主机的IP地址并连接到该主机相关问题 更多 >
编程相关推荐