#apache-flex #actionscript-3
Вопрос:
Я пытаюсь заставить приложение Flex взаимодействовать с пользовательским веб-сервером python, который я разработал.
Я замечаю, что не могу прочитать полученные postdata, потому что Flex, похоже, не включает длину содержимого в заголовки HTTP. (Мой веб-сервер работает при публикации в обычном HTML)
Это известная проблема? есть идеи, как установить заголовок длины содержимого?
Вот текущие отправляемые заголовки:
Хост: локальный хост:7070 Агент пользователя: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/20089092417 Firefox/3.0 .3 Принимаем: текст/html,приложение/xhtml xml,приложение/xml;q=0,9,*/*;q=0,8 Принять-Язык: en-us,en;q=0,5 Принять-Кодировка: gzip,сдуть Принять-Кодировка: ISO-8859-1,utf-8;q=0,7,*;q=0,7 Сохранить жизнь: 300 Связь: сохраняй-живи
Ответ №1:
Так и должно быть, если вы установите свойство метода HTTPService в значение POST. Если вы опустите его, по умолчанию будет указано значение GET, и параметры будут отправлены как часть строки запроса, а не как данные POST.
Я настроил этот сценарий, используя этот гибкий код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application layout="absolute"
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init()">
<mx:HTTPService id="service"
url="http://localhost:8000/"
method="POST"
resultFormat="text"
result="response.htmlText=ResultEvent(event).result.toString()"/>
<mx:Text id="response" width="100%" height="100%"/>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
private function init() : void {
service.send({
foo: "Fred",
bar: "Barney"
});
}
]]>
</mx:Script>
</mx:Application>
И этот серверный код python:
#!/usr/bin/env python
import SimpleHTTPServer, BaseHTTPServer, string
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_POST(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("<html><body>")
self.wfile.write("<b>METHOD:</b> " self.command)
# Write out Headers
header_keys = self.headers.dict.keys()
for key in header_keys:
self.wfile.write("<br><b>" key "</b>: ")
self.wfile.write(self.headers.dict[key])
# Write out any POST data
if self.headers.dict.has_key("content-length"):
content_length = string.atoi(self.headers.dict["content-length"])
raw_post_data = self.rfile.read(content_length)
self.wfile.write("<br><b>Post Data:</b> " raw_post_data)
self.wfile.write("</body></html>")
def do_GET(self):
self.do_POST()
try:
BaseHTTPServer.test(MyHandler, BaseHTTPServer.HTTPServer)
except KeyboardInterrupt:
print 'Exiting...'
И получил такой результат:
METHOD: POST
content-length: 19
accept-language: en-us,en;q=0.5
accept-encoding: gzip,deflate
connection: keep-alive
keep-alive: 300
accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
user-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
accept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
host: 10.0.7.61:8000
content-type: application/x-www-form-urlencoded
Post Data: bar=Barneyamp;foo=Fred
Так что это должно сработать.
Ответ №2:
Я не верю, что это известная проблема.
Вы уверены, что длина содержимого не отправляется? Вы разместили часть запроса HTTP-взаимодействия, исходящую из вашего браузера; на этой стороне протокола никогда не бывает заголовка длины содержимого.
Ответ №3:
Как говорит Билл Д., вы почти наверняка не публикуете ПОСТ, как мы делаем это все время, отправляя их с помощью нашего серверного кода, и он, безусловно, включает в себя длину контента.