8
votes

Envoi de la demande HTTP avec plusieurs paramètres ayant le même nom

J'ai besoin d'envoyer une requête HTTP (et d'obtenir une réponse XML) à partir de Flash qui ressemble à la suivante:

var url:String = myCustomFunctionForBuildingRequestString();
var resp:XML = new XML();
resp.onLoad = function(success:Boolean) {/*...*/};
resp.load(url);


0 commentaires

4 Réponses :


0
votes

Vous ne pouvez pas utiliser loadvars comme celui-ci - car data ​​code> peut être 1 ou 2 ou 3, pas tous en même temps.

Vous pouvez soit transmettre comme une liste séparée par des virgules : P> xxx pré>

ou en tant que chaîne XML, et analysez-le sur le serveur. Je ne connais pas la manipulation de XML en As2, mais c'est ainsi que vous le feriez dans AS3: p> xxx pré>

la chaîne que vous envoyez est la suivante: p>

<root>
  <data>1</data>
  <data>2</data>
  <data>3</data>
</root>


8 commentaires

Je sais que je ne peux pas le faire avec Loadvars, c'est pourquoi je pose la question. Je veux dire, Loadvars n'est évidemment pas la seule méthode d'envoi de demandes HTTP. Malheureusement, ni les paramètres de concaténation en une seule, ni de demande d'envoi en tant que XML ne sont pas appropriés.


Encore une fois, mon as2 est limité - mais quelle que soit la méthode que vous utilisez pour envoyer des données, une variable ne peut contenir qu'une seule valeur et vous devez donc faire un encodage comme une concaténation ou des tableaux XML ou JSON pour y accomplir.


Je ne demande pas de variables, je veux avoir plusieurs paramètres de demande avec le même nom, qui sont tout à fait sans rapport avec les variables, à moins que quelqu'un (ce qui est le cas avec LoadVars) pour des raisons inconnues décident de faire une correspondance individuelle entre elles .


Lorsque vous postez un paramètre de requête sur le serveur disant DATA = 1 et DATA = 2, que vous attendez-vous au serveur de déduire de cela?


Server fonctionne déjà et gère plusieurs paramètres de requêtes avec le même nom que la liste des valeurs. Je ne peux rien changer à ce sujet: Server travaille déjà avec différents types de clients écrits dans d'autres langues et personne ne corrigera tout cela simplement parce que ActionScript n'autorise pas ces demandes par des moyens standard.


Vous postez plusieurs valeurs pour la même variable via un autre type de client - dites JavaScript?


D'autres clients sont écrits en C ++ et Java.


D'autres clients ont été écrits par d'autres personnes, BTW. Je ne sais pas comment ils travaillent.



1
votes

Disclaimer; Je n'ai jamais utilisé ActionScript et je n'ai aucun moyen de tester cela.

Mettre le même nom de variable avec plusieurs valeurs de la chaîne de requête est le moyen standard d'envoi de variables multi-valeurs (par exemple, des cases à cocher de formulaire) sur des serveurs Web. Si loadvars code> est capable d'envoyer plusieurs valeurs, il semble plausible que les valeurs doivent être stockées dans un tableau: p> xxx pré>

Il semble également y avoir une Decode fonction à Loadvars , que se passe-t-il si vous essayez d'importer la chaîne de requête que vous souhaitez dans l'objet?: P>

req.decode("someParam1=foo&someParam1=bar&someParam1=bas");


2 commentaires

Malheureusement, lorsque vous attribuez un tableau pour demander un paramètre de requête, il fait quelque chose comme Array.join (",") (Eh bien, il appelle probablement sa méthode de ToString () et l'attribue à la demande de paramètre (c'est-à-dire qu'il existe un paramètre Onyl un avec des virgules valeurs). Si vous décochez la chaîne, vous obtenez une valeur de type chaîne égale à la valeur de la dernière des paramètres (pour vous, ce serait «BAS»). Semble que LoadVars est incapable d'envoyer de telles demandes par conception.


En effet, la représentation interne doit être une mappage de la chaîne à la chaîne. Vous devrez construire la chaîne de requête en utilisant un autre outil ou décoder les différentes valeurs du serveur.



5
votes

Bien que la poste puisse avoir plusieurs valeurs pour la même clé, je l'utiliserais, car certains serveurs ne peuvent même pas gérer correctement cela, ce qui est probablement pourquoi cela n'est pas pris en charge ... si vous convertissez " Dupliquer "Paramètres à une liste, tout ce qui pourrait commencer à s'étouffer, si un paramètre n'entre qu'une seule fois, et que SUDDDENDLY VOUS aime avoir une chaîne ou quelque chose ... mais je suppose que vous savez ce que vous faites ... < / p>

Je suis désolé de le dire, mais ce que vous voulez faire, n'est pas possible dans pure AS2 ... Les seules 2 classes disponibles pour HTTP sont loadvars et xml ... Techniquement, il y a aussi loadvariables , mais il copiera simplement copier des propriétés de l'objet transgé dans la demande, ce qui ne change pas votre problème, car les propriétés sont uniques ...

Si vous voulez coller à AS2, vous avez besoin d'un niveau intermédiaire:

  1. Un serveur pour transférer vos appels. Si vous avez accès au serveur, vous créez un nouveau point d'extrémité pour les clients AS2, qui décodera les demandes et les transmettre au point final normal.
  2. Utilisez JavaScript. avec flash.external :: externalinterface Vous pouvez appeler le code JavaScript. Vous devez définir un rappel lorsque l'opération est effectuée, ainsi qu'une fonction JavaScript que vous pouvez appeler (il existe d'autres moyens, mais cela devrait suffire). Construisez la chaîne de demande à l'intérieur Flash, pompe-la sur JavaScript et laissez-la envoyer à JavaScript sur le serveur dans une requête de poste et récupérez la réponse au clignotant dans le rappel.

    Jusqu'à vous de décider lequel est plus de travail ...

    côté Note: in AS3, vous utiliseriez flash.net:oRLLoader avec dataformat défini sur flash.net :: urlloaderdataformat.text , puis à nouveau coder les paramètres à une chaîne et envoyez-leur.


0 commentaires

8
votes

Le mode HTTP standard d'envoi de données de tableau est xxx pré>

mais ce n'est pas faux non plus (ajouté de commentaires): P>

http://example.com/?data[]=1&data[]=2


4 commentaires

+1, bien que réellement je pensais que ce serait exemple.com/?data [] = 1 & Data [] = 2 , alors que ce que vous avez écrit est pour les tableaux rares ou associatifs ... Avez-vous une source, qui stipule que tous les articles, mais le dernier devraient être ignorés? De nombreux serveurs agissent de cette façon, mais je ne pouvais trouver aucune spécification le demandant ...


J'ai édité un peu la phrase. Je ne connais aucune spécification le disant, j'ai ajouté "en pratique".


Et sur des tableaux rares ... ce n'est pas une donnée que le serveur devrait s'occuper de ce que [] signifie «ajouter au tableau». Et si vous allez envoyer deux mille articles, il y a de meilleurs moyens. ;)


Encore une fois: le serveur est déjà écrit et travaille et je ne peux rien changer. Il comprend de telles demandes bien. Il ne écrase rien en mémoire lors de la lecture de paramètres.