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 服务器问题(简单的东西)的主要内容,如果未能解决你的问题,请参考以下文章

FTP、ssh、http、telnet、https

通过代理使用 Telnet 隧道 HTTP

当我使用 telnet 与 http 服务器通信时,NVT 是不是有任何副作用?

是否可以创建一个通过 telnet 或 http 连接到设备的 OPC 服务器?

为啥我们可以使用 telnet 连接 http 或 memcached?

Telnet HTTP 免费服务器限制