HTTP telnet POST / GAE сервер вопрос (SIMPLE STUFF) - PullRequest
0 голосов
/ 08 июля 2011

Я играю с передачей HTTP, просто пытаюсь заставить что-то работать. У меня есть сервер GAE, и я уверен, что он работает правильно, потому что он рендерится, когда я захожу на него с помощью браузера, но в любом случае вот код Python:

<code>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 '

Я только изучаю весь процесс HTTP POST против GET против Response, но это то, что я делал с терминала:

<code>$ 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!!!
Соединение прервано внешним хостом.

Я использую GET здесь, потому что я спотыкался около 40 минут, пытаясь заставить Telnet POST работать - безуспешно :(

Буду признателен за любую помощь в том, как заставить этот GET и / или POST работать. Заранее спасибо !!!!

1 Ответ

2 голосов
/ 08 июля 2011

при использовании GET данные не будут присутствовать в теле запроса, поэтому sys.stdin.read() обязательно завершится с ошибкой.вместо этого вы можете захотеть взглянуть на окружение, в частности os.environ['QUERY_STRING']

Еще одна странная вещь, которую вы делаете, - вы не используете правильный формат запроса.Вторая часть запроса не должна включать схему URL, хост или порт, она должна выглядеть следующим образом:

GET /?number=28 HTTP/1.0

указывать хост в отдельном заголовке Host:;сервер сам определит схему.

При использовании POST большинство серверов не будут считывать количество данных в заголовке Content-Length, что, если вы его не предоставите, можетпредполагается, что это нулевые байты.Сервер может попытаться прочитать любые байты после точки, заданной длиной содержимого, чтобы быть следующим запросом в постоянном соединении, и когда он не начинается с действительного запроса, он закрывает соединение.Итак, в основном:

POST / HTTP/1.0
Host: localhost: 8080
Content-Length: 2
Content-Type: text/plain

28

Но почему вы тестируете это в telnet?Как насчет curl?

$ 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': []}
>>> 
...