通过http

时间:2019-06-01 23:57:08

标签: python sockets pythonanywhere

我正在尝试与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帐户是免费赠品。

1 个答案:

答案 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。