发送具有多个同名参数的 HTTP 请求

Posted

技术标签:

【中文标题】发送具有多个同名参数的 HTTP 请求【英文标题】:Sending HTTP request with multiple parameters having same name 【发布时间】:2010-12-22 13:08:05 【问题描述】:

我需要从 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 请求的能力。有其他选择吗?

更改请求不合适。

【问题讨论】:

【参考方案1】:

发送数组数据的标准http方式是

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

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

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

像您一样发送更多具有相同名称的参数,实际上意味着应该忽略除最后一项之外的所有参数。这是因为在读取变量时,服务器会覆盖(在内存中)与该项目同名的任何项目,因为重命名变量不是好的做法,而且从来都不是。

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

【讨论】:

+1,虽然实际上我认为它会是example.com/?data[]=1&data[]=2,而你写的是稀疏或关联数组......你有任何来源,说明除了最后一个之外的所有项目应该忽略吗?许多服务器都以这种方式运行,但我找不到任何真正要求它的规格...... 我稍微修改了句子。我不知道有任何规范说它,我添加了“在实践中”。 关于稀疏数组......服务器不应该关心 [] 表示“附加到数组”。如果您要发送两千件物品,那么还有更好的方法。 ;) 再一次:服务器已经写好并且可以工作了,我不能改变任何东西。它可以很好地理解此类请求。读取参数时不会覆盖内存中的任何内容。【参考方案2】:

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

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

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

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

由你来决定哪一个是更多的工作......

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

【讨论】:

【参考方案3】:

免责声明;我从未使用过 Actionscript,也无法对此进行测试。

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

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

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

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

【讨论】:

不幸的是,当您将数组分配给请求参数时,它会执行类似 array.join(",") 的操作(嗯,它可能调用它的 toString() 方法)并将其分配给请求参数(即只有一个带有逗号分隔值的参数)。如果你解码字符串,那么你会得到一个字符串类型的值,它等于参数值的最后一个(例如,它是“bas”)。似乎 LoadVars 无法按设计发送此类请求。 确实如此,内部表示必须是从字符串到字符串的映射。您必须要么使用其他工具构造查询字符串,要么解码服务器上的不同值。【参考方案4】:

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

【讨论】:

我知道我不能用 LoadVars 做到这一点,这就是我问这个问题的原因。我的意思是,LoadVars 显然不是发送 HTTP 请求的唯一方法。不幸的是,将参数连接成单个参数或以 XML 格式发送请求都不合适。 再说一次,我的 AS2 是有限的 - 但无论您使用哪种方法发送数据,一个变量只能保存一个值,因此您必须进行一些编码,如连接或 xml 或json-arrays 来完成这个。 我不是在询问变量,我希望有多个同名的请求参数,这些参数与变量完全无关,除非有人(LoadVars 就是这种情况)出于未知原因决定做出它们之间一一对应。 当你向服务器发布一个请求参数说 data=1 和 data=2 时,你希望服务器从中推断什么? 服务器已经在工作并处理多个与值列表同名的请求参数。我对此无能为力:服务器已经在使用用其他语言编写的不同类型的客户端,没有人会仅仅因为 actionscript 不允许通过标准方式进行此类请求而修补所有这些。

以上是关于发送具有多个同名参数的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

查询参数(axios 请求)中具有相同键的多个字段?

当 HTML 作为 JSON 请求的参数发送时,具有多个 CSS 类的 HTML 不会呈现

Yandex-tank - 具有不同 http 标头的多个请求

怎么用LINUX发送HTTP请求

怎么用LINUX发送HTTP请求

requests -- http请求库(基础)