2010-11-05 3 views
1

Все,Как POST данные JSON из Flash (AS2) с JSON в теле запроса

Я работаю на AS2 приложения Flash-что нужно для отправки данных в формате JSON для веб-службы.

В предыдущих проектах я использовал LoadVars.send() или LoadVars.sendAndLoad() успешно справиться с этим:

var send_lv:LoadVars = new LoadVars(); 
send_lv.data = JSON.stringify({some json object}); 

var response_lv:LoadVars = new LoadVars(); 
response_lv.onData = function(rawdata) { 
    var o:Object = JSON.parse(rawdata); 
    .... 
} 

send_lv.sendAndLoad("somepage.php", response_lv, "POST"); 

В somepage.php, я могу захватить, что данные в формате JSON с помощью $ _POST [ 'данные'].

Однако в этом проекте разработчик веб-службы требует, чтобы содержимое JSON являлось BODY запроса (то есть, а не парой имя/значение). Возможно ли это с помощью LoadVars?

Если нет, есть ли другой способ сделать это с AS2?

Большое спасибо заранее!

ответ

4

Извините ... Это уже второй раз в этом месяце я отвечаю на свой вопрос. Тем не менее, это лучшее, что у меня есть до сих пор ...

Короче говоря, с помощью LoadVars() вы можете POST серию пар имя/значение в URL. Но разработчик конкретного сервиса, в который я отправляю данные, специально спросил, что вместо использования пар имя/значение данные являются телом сообщения.

Я не мог понять, как это сделать с помощью LoadVars().

Однако, похоже, что я могу сделать это с помощью XML.sendAndLoad(), хотя данные, которые я отправляю, на самом деле НЕ XML (в моем случае это JSON).

Например, если JSON хранится в объекте с именем JSON:

dataAsString = JSON.stringify(json); 
var send_xml:XML = new XML(dataAsString); 
var response_xml:XML = new XML() 
response_xml.onData = function(rawResponseData) { 
    trace (rawResponseData); 
} 
send_xml.sendAndLoad([url], response_xml, "POST"); 

Если [URL] является «somepage.php», а затем, на странице PHP, вы можете получить данные, как это:

<?php 
    $data = file_get_contents("php://input"); 
    // data will contain now contain the json object as a string 
?> 

Я не могу себе представить, что это единственный (или лучший) способ сделать это. Например, send_xml не является допустимым объектом XML (поскольку строка json явно не будет действительной XML).

Тем не менее, это позволяет мне помещать строку JSON в службу без использования пары имя/значение.

+0

Вы скомпилировали свой проект с помощью Adobe Flash Professional? он замораживает swf, скомпилированный с mtasc, однако, похоже, это единственный вариант – www0z0k

3

Я знаю, что это старая тема, но лучшее решение, которое я нашел, которое также работает с PUT (через X-HTTP-Method-Override), - это получить новый класс из LoadVars, как описано jadent здесь: Sending JSON in ActionScript 2

class LoadJson extends LoadVars { 
    public var json:String; 

    public function toString() { 
     return json; 
    } 
} 

Это позволит вам сделать что-то вроде этого:

var lj:LoadJson = new LoadJson(); 
lj.json = {"key":"value"}; 
lj.onLoad = function(success:Boolean):Void { trace(success); }; 
lj.addRequestHeader(["X-HTTP-Method-Override", "PUT"]); 
lj.sendAndLoad("http://yoururl.com", lj, "POST"); 

У меня ушло 3 дня, чтобы найти, что -.-

0

Флориан Ли Ответ ghtning правильный (спасибо за сообщение).

Если вы хотите использовать предложенный LoadJson класс в качестве замены для LoadVars проекта-широкий (где он, вероятно, обрабатывать запросы GET) toString() должен вернуть его супер, если нет полезной нагрузки JSON не обнаружено.

class LoadJson extends LoadVars { 

    public var json:String; 

    public function toString() { 
     if (json != undefined) { 
      return json; 
     } 
     return super.toString(); 
    } 

} 
Смежные вопросы