使用具有相同名称的多个参数发送HTTP请求

时间:2009-12-02 19:00:53

标签: http actionscript

我需要从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请求的能力。任何替代方案?

更改请求不合适。

4 个答案:

答案 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的类是LoadVarsXML ...技术上有还loadVariables,但它只是将传递的对象中的属性复制到请求中,这不会改变您的问题,因为属性是唯一的......

如果你想坚持使用AS2,你需要一个中间层:

  1. 转发呼叫的服务器。如果您有权访问服务器,那么为AS2客户端创建一个新的端点,它将解码请求并将它们传递给普通端点。
  2. 使用javascript。使用flash.external::ExternalInterface,您可以调用JavaScript代码。您需要为操作完成时定义回调,以及可以调用的JavaScript函数(还有其他方法,但这应该就足够了)。在flash中构建请求字符串,将其泵入JavaScript并让JavaScript在POST请求中将其发送到服务器,并通过回调将响应返回到flash。
  3. 由您来决定哪一个更有效......

    在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>