我正在尝试与PythonAnywhere上托管的Web应用程序进行通讯。这是一个低带宽,低频连接,因此我对http接口没问题-并且可以通过浏览器在http上正常工作。但是,我似乎无法获得在云中运行的PythonAnywhere主机上运行的同一服务。
如果我在本地运行服务器,则可以:
import socket
s = socket.socket()
s.connect(('127.0.0.1', 8080))
s.send('GET /check/nicky HTTP/1.1\r\n\r\n')
print (s.recv(1024))
# 'HTTP/1.0 200 OK\r\nDate: Sat, 01 Jun 2019 23:45:14 GMT\r\nServer: WSGIServer/0.2 CPython/3.7.2\r\nContent-Type: application/json\r\nContent-Length: 19\r\n\r\n{"nicky": [0, 120]}'
但是,如果我在pythonanywhere URL上使用socket.getaddrinfo()
(以替换上面s.connect()
中的地址),则会收到“错误请求”响应:
'HTTP/1.1 400 Bad Request\r\nServer: openresty/1.9.15.1\r\nDate: Sat, 01 Jun 2019 23:49:48 GMT\r\nContent-Type: text/html\r\nContent-Length: 179\r\nConnection: close\r\n\r\n<html>\r\n<head><title>400 Bad Request</title></head>\r\n<body bgcolor="white">\r\n<center><h1>400 Bad Request</h1></center>\r\n<hr><center>openresty/1.9.15.1</center>\r\n</body>\r\n</html>\r\n'
如果我在浏览器中键入相同的请求,则服务器功能正常-但以编程方式尝试执行此操作始终会以这种方式失败。
这是我不知道的某种代理或端口转发魔术吗?有问题的pythonanwhere帐户是免费赠品。
答案 0 :(得分:0)
s.send('GET /check/nicky HTTP/1.1\r\n\r\n') .. 'HTTP/1.1 400 Bad Request\r\nServer: openresty/1.9.15.1\r\n ...
服务器正确。您发送的不是正确的HTTP请求。对于HTTP/1.1
,HTTP标头中的Host
字段是必需的。
如果添加了此请求,则请求可能会起作用,但可能会遇到其他各种麻烦,例如缺少对分块响应正文的支持,并假设所有操作都将在一次读取中完成。
尽管您可能尝试用自己的代码处理所有这些问题,但我建议您改用现有的HTTP库,例如requests。
如果您真的想编写自己的HTTP层,我真的建议您在实施标准之前先阅读并理解该标准,这就是标准的用途。对于HTTP/1.1
,这些是RFC 7230,并遵循RFC。