2010-11-08 12 views
1

Je cherche à transmettre une requête post via HTTP, le corps doit contenir des informations d'un ValueObject que j'ai déjà créé. Essentiellement, j'ai besoin de sérialiser l'objet (qui a plusieurs dimensions). Le problème que je rencontre est que je ne veux pas transmettre les données au format JSON ou XML mais comme un tableau multidimensionnel. Il fonctionne dans les formulaires HTML comme:Serialize Objet comme un formulaire dans as3

données:

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

      [b] => defg 
     ) 

    [d] => ghij 
) 

demande corps (décodé):

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

Y at-il là-bas bibliothèque qui fait ce genre de sérialisation déjà? J'utilise as3httpclientlib, donc je n'ai pas la commodité de la famille mx.rpc. J'ai passé ces dernières heures à essayer de mettre au point ma propre solution, mais je suis à peu près certain que je ferais mieux de trouver une solution dans laquelle quelqu'un a mis plus de temps et de réflexion.

+0

Toutes les réponses ci-dessous simplement vous montrer une façon de sérialiser un objet dans une chaîne. C'est ce que JSON est - objet sérialisé dans String. JSON CAN sérialiser un tableau multidimensionnel ou tout ce dont vous avez besoin. Il n'est pas nécessaire de créer votre propre (de) sérialiseur. Et puisque vous ne pouvez pas utiliser AMF, que j'admire le plus, je ne comprends pas pourquoi vous n'aimez pas JSON :) –

+0

Ceci est une question de 4 ans tout d'abord. Et ce n'est certainement pas que je "n'aime pas JSON", plutôt, j'ai dû encoder l'objet dans une URL. – noazark

Répondre

0

Vous pouvez essayer AMF pour résoudre votre problème (vous avez une bibliothèque différente en fonction de votre langage de programmation). Le principal avantage est que vous pouvez faire correspondre l'objet à l'objet (en utilisant l'objet Valeur) et conserver le type de données (comme les tableaux).

J'utilise le plugin amf avec Symfony et est ici un exemple de données renvoyées:

SabreAMF_TypedObject objet ( [amfClassName: private] => Produit

[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 
        ) 

      ) 

Quelques explications:

[amfClassName:private] => Product 

Mon objet est tapé Côté As3, j'ai un objet de valeur de produit qui contient également des propriétés de tableau ke "code", "désignation", "description", ... et la couleur (un autre tableau typé avec la valeur de l'objet Couleur)

Vous pouvez facilement avoir une structure multidimensionnelle de tableaux ...

+0

Mon problème avec AMF est simplement que j'utilise une API REST qui doit être ouverte aux autres en dehors du monde de l'AMF.J'essaye d'empêcher ce meunier de se compliquer. Et l'OMI ajoutant un autre type de contenu va un peu loin. – noazark

0

Ok,

alors voici quelque chose de plus simples à l'aide 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); 
    } 
} 

}

Je dEMANDÉ un fichier php et vient de mettre une fonction simple var_dump. retour Trace:

array(2) {["d"]=>string(4) "defg"["a"]=> array(2) {["a"]=>string(16) "toto,titi,loulou["b"]=>string(4) "desc"}} 
+0

Mais il ne sérialise pas un objet. Je devrais analyser l'objet à la main .... ce qui est plus le problème que le formatage de la requête. – noazark

+0

@Noah bientôt ou plus tard, vous devrez formater votre demande d'une manière ou d'une autre ... non? – OXMO456

+0

Oui, et je suppose que ce que je voulais dire était: Si je peux obtenir les propriétés d'un objet (récursivité complète) alors je pourrais facilement formater la sortie. Mon plus gros problème est d'obtenir la récursivité complète. – noazark

0
var url:String = 'http://localhost/dump.php'; 
var params:Object = { 
    test: 'ok', 
    nested_1: { 
     nested_2: { 
      nested_3: { 
       nested_4: { 
        hello: 'mf', 
        str: '[email protected]#$%^&*()_+' 
       } 
      } 
     } 
    }, 
}; 

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); 

et voici méthode 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; 
}