HTTP telnet POST/GAE 服务器问题(简单的东西)
Posted
技术标签:
【中文标题】HTTP telnet POST/GAE 服务器问题(简单的东西)【英文标题】:HTTP telnet POST/GAE server question (SIMPLE STUFF) 【发布时间】:2011-09-30 20:06:13 【问题描述】:我正在玩 HTTP 传输,只是想让某些东西起作用。我有一个 GAE 服务器,我很确定它工作正常,因为当我使用浏览器访问它时它会呈现,但无论如何这里是 python 代码:
import sys
print 'Content-Type: text/html'
print ''
print '<pre>'
number = -1
data = sys.stdin.read()
try:
number = int(data[data.find('=')+1:])
except:
number = -1
print 'If your number was', number, ', then you are awesome!!!'
print '</pre>'
我只是在学习整个 HTTP POST vs GET vs Response 过程,但这就是我从终端所做的:
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET http://localhost:8080/?number=28 HTTP/1.0
HTTP/1.0 200 Good to go
Server: Development/1.0
Date: Thu, 07 Jul 2011 21:29:28 GMT
Content-Type: text/html
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Content-Length: 61
<pre>
If your number was -1 , then you are awesome!!!
</pre>
Connection closed by foreign host.
我在这里使用 GET 是因为我偶然发现了大约 40 分钟试图使 telnet POST 工作 - 没有成功:(
对于如何让这个 GET 和/或 POST 工作的任何帮助,我将不胜感激。提前谢谢!!!!
【问题讨论】:
你这样做的方式可能是最痛苦的。为什么不在服务端使用 WSGI 和框架,在客户端使用 curl、wget 或 Web 浏览器? 【参考方案1】:当使用GET
时,请求体中不会出现任何数据,所以sys.stdin.read()
必然会失败。相反,您可能想查看环境,特别是 os.environ['QUERY_STRING']
另一件有点奇怪的事情是你没有使用正确的请求格式。请求的第二部分不应包含 url 方案、主机或端口,应如下所示:
GET /?number=28 HTTP/1.0
在单独的Host:
标头中指定主机;服务器将自行确定方案。
当使用POST
时,大多数服务器不会读取超过Content-Length
标头中的数据量,如果您不提供,可能会被假定为零字节。服务器可能会尝试读取 content-length 指定的点之后的任何字节,以作为持久连接中的下一个请求,并且当它不是以有效请求开始时,它会关闭连接。所以基本上:
POST / HTTP/1.0
Host: localhost: 8080
Content-Length: 2
Content-Type: text/plain
28
但是你为什么要在 telnet 中测试呢?卷曲怎么样?
$ curl -vs -d'28' -H'Content-Type: text/plain' http://localhost:8004/
* About to connect() to localhost port 8004 (#0)
* Trying ::1... Connection refused
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8004 (#0)
> POST / HTTP/1.1
> User-Agent: curl/7.20.1 (x86_64-redhat-linux-gnu) libcurl/7.20.1 NSS/3.12.6.2 zlib/1.2.3 libidn/1.16 libssh2/1.2.4
> Host: localhost:8004
> Accept: */*
> Content-Type: text/plain
> Content-Length: 2
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Thu, 07 Jul 2011 22:09:17 GMT
< Server: WSGIServer/0.1 Python/2.6.4
< Content-Type: text/html; charset=UTF-8
< Content-Length: 45
<
* Closing connection #0
'body': '28', 'method': 'POST', 'query': []
或者更好的是,在 python 中:
>>> import httplib
>>> headers = "Content-type": "text/plain",
... "Accept": "text/plain"
>>>
>>> conn = httplib.HTTPConnection("localhost:8004")
>>> conn.request("POST", "/", "28", headers)
>>> response = conn.getresponse()
>>> print response.read()
'body': '28', 'method': 'POST', 'query': []
>>>
【讨论】:
是的,这很有效 - 非常感谢。 (虽然是 os.environ 而不是 sys.environ)以上是关于HTTP telnet POST/GAE 服务器问题(简单的东西)的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 telnet 与 http 服务器通信时,NVT 是不是有任何副作用?
是否可以创建一个通过 telnet 或 http 连接到设备的 OPC 服务器?