2009-12-02 25 views
3

je dois envoyer une requête HTTP (et obtenir une réponse XML) à partir de Flash qui ressemble à ce qui suit:Envoi requête HTTP avec plusieurs paramètres ayant même nom

http://example.com/somepath?data=1&data=2&data=3 

à savoir avoir plusieurs paramètres qui partagent le même nom, mais ont des valeurs différentes.

Jusqu'à présent, j'utiliser le code suivant pour effectuer des requêtes HTTP:

var resp:XML = new XML(); 
resp.onLoad = function(success:Boolean) {/*...*/}; 
resp.ignoreWhite = true; 

var req:LoadVars = new LoadVars(); 
req["someParam1"] = 3; 
req["someParam2"] = 12; 

req.sendAndLoad("http://example.com/somepath", resp, "GET"); 

Dans ce cas, cela ne va pas: il n'y aura qu'un seul paramètre ayant une valeur dernière.

Quelles sont mes options? J'utilise actionscript 2.

Ajouté

Je suppose que je peux faire quelque chose comme ça:

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

Mais dans ce cas, je perdais la capacité de faire des requêtes POST. Des alternatives?

La modification de la requête n'est pas appropriée.

Répondre

1

Bien que POST peut avoir plusieurs valeurs pour la même clé, je serais prudent de l'utiliser, car certains serveurs ne peuvent même pas gérer correctement ce qui est probablement la raison pour laquelle cette n'est pas pris en charge ... si vous convertissez des paramètres "dupliqués" en une liste, le tout m commencez à vous étouffer, si un paramètre n'arrive qu'une fois, et soudainement vous finirez par avoir une corde ou quelque chose ... mais je suppose que vous savez ce que vous faites ...

Je suis désolé de le dire, mais ce que vous voulez faire, n'est pas possible en AS2 pur ...les 2 seules classes disponibles pour HTTP sont LoadVars et XML ... techniquement il y a aussi loadVariables, mais il va simplement copier les propriétés de l'objet passé dans la requête, ce qui ne change pas votre problème, puisque 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 de terminaison pour les clients AS2, qui décode les requêtes et les transmet au point de terminaison normal.
  2. utilisez javascript. avec flash.external::ExternalInterface vous pouvez appeler le code JavaScript. Vous devez définir un rappel pour le moment où 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 requête à l'intérieur de flash, pompez-la dans JavaScript et laissez JavaScript l'envoyer au serveur dans une requête POST et récupérez la réponse à travers le rappel.

à vous de décider lequel est le plus de travail ...

remarque: en AS3, vous utiliseriez flash.net::URLLoader avec dataFormat ensemble à flash.net::URLLoaderDataFormat.TEXT, puis à nouveau encode paramètres à une chaîne et envoyez-les.

0

Vous ne pouvez pas utiliser des loadvars comme ceci - parce que data peut être 1 ou 2 ou 3, pas tous en même temps.

Vous pouvez passer soit comme une liste séparée par des virgules:

var req:LoadVars = new LoadVars(); 
req["data"] = "1,2,3"; 

ou comme une chaîne XML, et l'analyser au niveau du serveur. Je ne suis pas familier avec la manipulation de xml dans AS2, mais comment vous le feriez en AS3:

var xml:XML = <root/>; 
xml.appendChild(<data>1</data>); 
xml.appendChild(<data>2</data>); 
xml.appendChild(<data>3</data>); 

//now pass it to loadvars 
req["data"] = xml.toXMLString(); 

La chaîne que vous envoyez est:

+0

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 pour envoyer des requêtes HTTP. Malheureusement, ni concaténer des paramètres en une seule, ni envoyer de requête en XML n'est pas approprié. – n0rd

+0

Encore une fois, mon AS2 est limité - mais quelle que soit la méthode utilisée pour envoyer des données, ** une variable ne peut contenir qu'une seule valeur ** et vous devez donc effectuer un encodage comme concaténation ou xml ou json-array. – Amarghosh

+0

Je ne parle pas de variables, je veux avoir plusieurs paramètres de requête avec le même nom, qui sont sans rapport avec les variables, à moins que quelqu'un (ce qui est le cas avec LoadVars) pour des raisons inconnues décide de faire une correspondance biunivoque leur. – n0rd

1

Avertissement; Je n'ai jamais utilisé Actionscript et je n'ai aucun moyen de le tester. Le fait d'associer le même nom de variable à plusieurs valeurs sur la chaîne de requête est la manière standard d'envoyer des variables à valeurs multiples (par exemple des cases à cocher) aux serveurs Web. Si LoadVars est capable d'envoyer plusieurs valeurs alors il semble plausible que les valeurs doivent être stockées dans un tableau:

req["someParam1"] = ["foo","bar","bas"]; 

Il semble aussi être une fonction decode à LoadVars, ce qui se passe si vous essayez d'importer la chaîne de requête vous voulez dans l'objet ?:

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

Malheureusement, lorsque vous affectez un tableau pour demander un paramètre, il fait quelque chose comme array.join (",") (bien, il appelle probablement sa méthode toString()) et l'assigne pour demander un paramètre (ie on a un paramètre avec valeurs séparées). Si vous décodez une chaîne, alors vous obtenez une valeur de type string qui est égale à la dernière valeur de params (par exemple, ce serait "bas"). Semble que LoadVars est incapable d'envoyer de telles demandes par conception. – n0rd

+0

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

2

La méthode standard http d'envoyer des données de tableau est

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

Mais ce n'est pas mal non plus (ajouté de commentaire):

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

L'envoi de paramètres avec le même nom que vous » re faire, en pratique signifie que tout sauf le dernier élément doit être ignoré. En effet, lors de la lecture des variables, le serveur écrase (en mémoire) tout élément ayant le même nom que celui-ci, car renommer une variable n'est pas une bonne pratique et n'a jamais existé. Je ne connais pas beaucoup d'AS (aucun: p) mais vous y accèderiez comme une liste ou un tableau ou toute autre structure de données dont il dispose.

+0

+1, même si en fait je pensais que ce serait http://example.com/?data[]=1&data[]=2, alors que ce que vous avez écrit est pour des tableaux clairsemés ou associatifs ... avez-vous une source, qui stipule que tous les éléments, sauf le dernier, doivent être ignorés? De nombreux serveurs agissent de cette façon, mais je n'ai pas trouvé de spécifications l'exigeant réellement ... – back2dos

+0

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

+0

Et à propos des tableaux clairsemés ... ce n'est pas un fait que le serveur devrait se soucier de ce que cela signifie [] signifie 'ajouter au tableau'. Et si vous envoyez deux mille objets, alors il y a de meilleurs moyens. ;) –

Questions connexes