代码之家  ›  专栏  ›  技术社区  ›  n0rd

使用多个同名参数发送HTTP请求

  •  5
  • n0rd  · 技术社区  · 15 年前

    我需要从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");
    

    在这种情况下不会这样做:只有一个参数具有最后一个值。

    我有什么选择?我正在使用ActionScript 2。

    补充

    我想,我可以这样做:

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

    但在这种情况下,我失去了处理邮件请求的能力。有其他选择吗?

    更改请求不合适。

    4 回复  |  直到 11 年前
        1
  •  1
  •   Taryn Frank Pearson    11 年前

    虽然post可能对同一个密钥有多个值,但我会谨慎使用它,因为有些服务器甚至不能正确处理这些值,这可能是不支持它的原因…如果你把“重复的”参数转换成一个列表,整个事情可能会开始窒息,如果一个参数只有一次,然后突然你得到一个字符串或其他东西…但我想你知道你在做什么…

    我很抱歉这么说,但你想做的,是不可能在纯粹的AS2…只有2个可用于HTTP的类是 LoadVars XML …技术上也有 loadVariables ,但它只是将属性从传递的对象复制到请求中,这不会改变您的问题,因为属性是唯一的…

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

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

    由你决定哪一个更有效…

    边注: 在AS3中,您将使用 flash.net::URLLoader 具有 dataFormat 设置为 flash.net::URLLoaderDataFormat.TEXT ,然后再次将参数编码为字符串,并发送它们。

        2
  •  3
  •   Tor Valamo    15 年前

    发送阵列数据的标准HTTP方式是

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

    但这也没有错(从评论中添加):

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

    发送更多同名参数, 在实践中 意味着除了最后一项之外的所有项都应被忽略。这是因为当读取变量时,服务器会覆盖(在内存中)与该变量同名的任何项,因为重命名变量不是一个好的实践,而且从来都不是。

    我不太了解(none:p),但您可以将其作为列表或数组或它拥有的任何数据结构访问。

        3
  •  1
  •   Anders Lindahl    15 年前

    免责声明;我从来没有使用过actionscript,也没有测试这个的方法。

    将具有多个值的同一变量名放入查询字符串是向Web服务器发送多值变量(例如表单复选框)的标准方法。如果 LoadVars 能够发送多个值,那么这些值应该存储在一个数组中似乎是合理的:

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

    似乎还有一个 decode 函数到 LoadVars ,如果尝试将所需的查询字符串导入到对象中会发生什么情况?:

    req.decode("someParam1=foo&someParam1=bar&someParam1=bas");
    
        4
  •  0
  •   Amarghosh    15 年前

    您不能使用这样的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>