2009-02-03 6 views
2

Nous avons actuellement une applet Java qui génère beaucoup de données et les télécharge sur nos serveurs. L'une des méthodes de téléchargement que nous avons est d'utiliser un HTTP POST à ​​notre serveur, dont le contenu est juste les données brutes (pas d'encodage en plusieurs parties ou quoi que ce soit).Télécharger des données arbitraires dans HTTP Post dans Flex

Je cherche à implémenter une application Flex qui fait la même chose, mais je ne vois pas comment dupliquer ce comportement réseau. Toutes les classes de réseau liées à HTTP dans Flex semblent fonctionner sous l'hypothèse que vous faites simplement une demande. Je ne vois pas un moyen de définir réellement la charge utile du POST (autre que de définir quelques paramètres de requête, ce qui ne fonctionnerait pas ici).

Ce que j'aimerais vraiment, c'est pouvoir initier un POST HTTP, mais ensuite être capable d'écrire sur la connexion comme je le ferais avec un socket. Est-ce possible sans avoir à écrire ma propre implémentation HTTP au-dessus de la classe Socket? Est-il possible de définir la charge utile d'un HTTP POST dans Flex? Clarification: La possibilité de créer un tampon de données et de l'envoyer au serveur est suffisante (ce qui semble possible). Il vaudrait mieux que je traite la connexion comme une socket et que je lui envoie des données au fil du temps, au lieu de toutes en même temps, mais ce n'est pas strictement nécessaire.

Répondre

2

Il semble que vous posiez deux questions. Oui, il y a un moyen de définir la charge utile d'un HTTP POST dans Flex, et de télécharger des fichiers de tout format sur votre serveur:

private function doPost():void 
{ 
    var yourData:ByteArray = new ByteArray(); 
    var encoder:Base64Encoder = new Base64Encoder(); 

    for (var i:int = 0; i < 10000; i++) 
     yourData.writeByte(i); 

    yourData.position = 0; 
    encoder.encodeBytes(yourData); 

    var req:URLRequest = new URLRequest("http://yourdomain.com/yourservice.ext"); 
    req.method = URLRequestMethod.POST; 

    var postData:URLVariables = new URLVariables(); 
    postData.userData = encoder.flush(); 

    req.data = postData; 

    var loader:URLLoader = new URLLoader(); 
    loader.dataFormat = URLLoaderDataFormat.BINARY; 
    loader.addEventListener(Event.COMPLETE, loader_complete); 
    loader.load(req); 
} 

private function loader_complete(event:Event):void 
{ 
    trace("Upload complete!"); 
} 

... mais il semble aussi que vous voulez vous connecter, garder la connexion ouverte et ensuite écris arbitrairement "comme une socket"; si c'est le cas, alors à part utiliser les classes Socket à cet effet, je ne crois pas qu'il existe un mécanisme intégré, non. J'espère que ça aide quand même!

+0

J'ai regardé la documentation URLRequest. Quel est le gain dans l'utilisation de URLVariables? Les docs semblent suggérer que vous pourriez juste faire req.data = yourData et cela fonctionnerait. Quelle est la différence? – Herms

+0

Dépend de la façon dont vous allez lire les données publiées. Ci-dessus, je suppose simplement le scénario habituel, dans lequel une page reçoit les octets par nom (par exemple, Request.Form ["userData"], etc.); URLVariables rend simplement cela plus facile. Mais je ne pense pas que ce soit nécessaire, non - je l'ai toujours utilisé à cette fin. –

+0

Aucun nom. Il est traité comme un flux de données brutes. Donc, si je comprends bien, je devrais définir les données comme étant le tableau d'octets directement et ne pas utiliser URLVariables, n'est-ce pas? – Herms

Questions connexes