Сериализация объекта как формы в as3 - PullRequest
1 голос
/ 08 ноября 2010

Я хочу передать пост-запрос через HTTP, тело должно содержать информацию из объекта ValueObject, который я уже создал.По сути, мне нужно сериализовать объект (который имеет несколько измерений).Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу передавать данные в виде JSON или XML, а в виде многомерного массива.Он работает в HTML-формах, таких как:

data:

Array
(
    [a] => Array
        (
            [a] => Array
                (
                    [1] =>  abcd
                )

            [b] => defg
        )

    [d] => ghij
)

тело запроса (декодированное):

a[a][1]=abcd&a[b]=defg&d=ghij

Есть ли какая-либо библиотека, которая выполняет такого родасериализация уже?Я использую as3httpclientlib, поэтому у меня нет удобства семейства mx.rpc.Я потратил последние несколько часов, пытаясь найти свое собственное решение, но я уверен, что мне было бы лучше, если бы кто-то вложил больше времени и подумал.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2010

Хорошо,

, так что вот что-то более простое с использованием URLVariables:

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;

public class URLVariableExample extends Sprite {

    private static const URL_SERVER:String = "http://localhost/testURL.php";
    private var loader:URLLoader;

    public function URLVariableExample() {
        init();
    }

    private function init() : void {
        var request:URLRequest = new URLRequest(URL_SERVER);

        var urlVar:URLVariables = new URLVariables();
    var a : Array = ["toto", "titi", "loulou"];
        urlVar["urlTest[a][a]"] = a.toString();
        urlVar["urlTest[a][b]"] = "desc";
        urlVar["urlTest[d]"] = "defg";

        request.data = urlVar;
        request.method = URLRequestMethod.POST;

        loader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loaderComplete);       
        loader.load(request);
    }

    private function loaderComplete(event : Event) : void {
        loader.removeEventListener(Event.COMPLETE, loaderComplete);
        trace(URLLoader(event.currentTarget).data);
    }
}

}

Я запросил php-файл и просто поместил простую функцию var_dump.Возврат трассировки:

array(2) {["d"]=>string(4) "defg"["a"]=> array(2) {["a"]=>string(16) "toto,titi,loulou["b"]=>string(4) "desc"}}
0 голосов
/ 02 апреля 2014
var url:String = 'http://localhost/dump.php';
var params:Object = {
    test: 'ok',
    nested_1: {
        nested_2: {
            nested_3: {
                nested_4: {
                    hello: 'mf',
                    str: '~!@#$%^&*()_+'
                }
            }
        }
    },
};

var request:URLRequest = new URLRequest(url);
var variables:URLVariables = new URLVariables();

parameters = fixParameters(parameters || {});

for (var key:String in parameters) {
    variables[key] = parameters[key];
}

request.data = variables;

var loader:URLLoader = new URLLoader();
loader.load(request);

и вот метод fixParameters

private function fixParameters(data:Object, parameters:Object = null, prefixes:Array = null):Object {
    var setPrefix:Array;
    var prefixKey:String;

    if (!parameters) {
        parameters = {};
    }

    if (!prefixes) {
        prefixes = [];
    }

    for (var key:String in data) {
        setPrefix = prefixes.concat([key]);

        if (typeof(data[key]) == 'object') {
            parameters = fixParameters(data[key], parameters, setPrefix);
        } else {
            prefixKey = '';
            for (var i:Number = 0; i < setPrefix.length; i++) {
                prefixKey += i == 0 ? setPrefix[i] :  '[' + setPrefix[i] + ']';
            }
            parameters[prefixKey] = data[key];
        }
    }

    return parameters;
}
0 голосов
/ 08 ноября 2010

Вы можете попробовать AMF для решения вашей проблемы (у вас есть разные библиотеки в зависимости от вашего языка программирования). Основным преимуществом является то, что вы можете сделать отображение объекта на объект (используя Value Object) и сохранить тип данных (например, массивы).

Я использую плагин amf с Symfony, и вот пример возвращаемых данных:

SabreAMF_TypedObject Object ( [amfClassName: private] => Продукт

[amfData:private] => Array
    (
        [code] => 1970A007
        [designation] => 1970 PELL A007 BLANC
        [description] => Vernis extra souple extra brillant
        [sommeil] => 
        [name] => 1970
        [base] => A Stretch Enduit
        [composition] => 43% PL 57% PU
        [laize] => 137-140 cm
        [weight] => 588 g/ml
        [dechirure] => 10 daN/9 daN
        [abrasion] => 5000
        [xenotest] => 4/5
        [non_feu] => Non
        [Color] => SabreAMF_TypedObject Object
            (
                [amfClassName:private] => Color
                [amfData:private] => Array
                    (
                        [id] => 124
                        [name] => BLANC
                    )

            )

Некоторые объяснения:

[amfClassName:private] => Product

Мой объект напечатан. Что касается стороны 3, у меня тоже есть объект значения продукта, который содержит свойства массива, такие как «код», «обозначение», «описание», ... и цвет (еще один типизированный массив с цветом объекта значения)

Так что вы можете легко иметь многомерную структуру массивов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...