我需要从Flash发送一个类似于以下内容的HTTP请求(并获取XML响应):
http://example.com/somepath?data=1&data=2&data=3
即。具有多个共享相同名称但具有不同值的参数。
到目前为止,我使用以下代码发出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");
在这种情况下,这不会:只有一个参数具有最后一个值。
我有什么选择?我正在使用动作2。
加
我想,我可以这样做:
var url:String = myCustomFunctionForBuildingRequestString();
var resp:XML = new XML();
resp.onLoad = function(success:Boolean) {/*...*/};
resp.load(url);
但在这种情况下,我失去了执行POST请求的能力。任何替代方案?
更改请求不合适。
答案 0 :(得分:5)
发送阵列数据的标准http方式是
http://example.com/?data[0]=1&data[1]=2
但这也没错(从评论中补充):
http://example.com/?data[]=1&data[]=2
使用与您正在进行的相同名称发送更多参数, in practice 意味着应忽略除最后一项之外的所有参数。这是因为在读取变量时,服务器会覆盖(在内存中)与该名称具有相同名称的任何项目,因为重命名变量并不是一种好的做法,而且从来都不是。
我不太了解AS(none:p),但你可以将它作为列表或数组或其拥有的任何数据结构来访问。
答案 1 :(得分:2)
虽然POST可能对同一个键有多个值,但我会谨慎使用它,因为有些服务器甚至无法正确处理它,这可能是为什么不支持这个...如果你转换“将“参数复制到列表中,整个事情可能会开始窒息,如果一个参数只进入一次,那么你最后会出现一个字符串或什么......但我想你知道你在做什么......” / p>
我很遗憾地这么说,但是你想要做什么,在纯AS2中是不可能的......只有2个可用于HTTP的类是LoadVars
和XML
...技术上有还loadVariables
,但它只是将传递的对象中的属性复制到请求中,这不会改变您的问题,因为属性是唯一的......
如果你想坚持使用AS2,你需要一个中间层:
flash.external::ExternalInterface
,您可以调用JavaScript代码。您需要为操作完成时定义回调,以及可以调用的JavaScript函数(还有其他方法,但这应该就足够了)。在flash中构建请求字符串,将其泵入JavaScript并让JavaScript在POST请求中将其发送到服务器,并通过回调将响应返回到flash。由您来决定哪一个更有效......
在AS3中 旁注:,您使用flash.net::URLLoader
并将dataFormat
设置为flash.net::URLLoaderDataFormat.TEXT
,然后再将参数编码为字符串,然后发送它们。
答案 2 :(得分:1)
声明;我从未使用过Actionscript,也没有办法测试它。
在查询字符串上放置具有多个值的相同变量名称是向Web服务器发送多值变量(例如表单复选框)的标准方法。如果LoadVars
能够发送多个值,那么值似乎应该存储在数组中似乎是合理的:
req["someParam1"] = ["foo","bar","bas"];
decode似乎还有LoadVars函数,如果您尝试将所需的查询字符串导入对象,会发生什么?:
req.decode("someParam1=foo&someParam1=bar&someParam1=bas");
答案 3 :(得分:0)
你不能使用这样的loadvars - 因为data
可以是1或2或3,而不是所有这些同时。
您可以将其作为逗号分隔列表传递:
var req:LoadVars = new LoadVars();
req["data"] = "1,2,3";
或作为xml字符串,并在服务器上解析它。我不熟悉在AS2中操作xml,但这是你在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();
您发送的字符串是:
<root>
<data>1</data>
<data>2</data>
<data>3</data>
</root>