我可以控制 HTTPService Post 中的参数顺序吗?
Can I control the parameter order in an HTTPService Post?
我正在更新使用 Cairngorm 框架使用 Flex 4.15.0 和 AIR 23.0 构建的销售点系统。
该代码与我客户的支付处理器供应商提供的自定义服务器集成。我不知道其实施的任何细节。
部分要求是以特定顺序将参数发布到其服务器的形式。 Apache Flex/AIR 似乎没有保留对象参数的参数顺序。有办法吗?
更多细节,代码:
HTTPService是在Cairngorm中设置的Services.mxml:
<mx:HTTPService id="service"
showBusyCursor="false"
requestTimeout="240"
method="post" contentType="application/x-www-form-urlencoded"
url="http://localhost.:16448/" resultFormat="e4x"
/>
创建参数对象并调用服务方法;这是在 Cairngorm 委托中完成的:
var parameters : Object = new Object();
parameters.firstParameter = "firstOne";
parameters.amount = 100;
parameters.otherParameters = "Other Random Misc Data";
parameters.lastParameter = "LastOne";
然后拨打电话:
var call : Object = this.service.send(parameters);
call.addResponder( this.responder );
Flex Framework class mx.rpc.httpAbstractOperation 将参数对象添加到传出服务调用。这从第 862 行开始。这使用 classinfo.properties 遍历属性。这似乎从我的对象中获取了按字母顺序排列的属性列表,并将它们添加到 paramsToSend 对象中:
else if (ctype == CONTENT_TYPE_FORM)
{
paramsToSend = {};
var val:Object;
if (typeof(parameters) == "object")
{
//get all dynamic and all concrete properties from the parameters object
var classinfo:Object = ObjectUtil.getClassInfo(parameters);
for each (var p:* in classinfo.properties)
{
val = parameters[p];
if (val != null)
{
if (val is Array)
paramsToSend[p] = val;
else
paramsToSend[p] = val.toString();
}
}
}
else
{
paramsToSend = parameters;
}
}
查看 Flash Builder 网络监视器中的原始数据;最终请求没有按字母顺序排列的参数。
otherParameters=Other%20Random%20Misc%20Data&lastParameter=LastOne&firstParameter=firstOne&amount=100
在这个小样本中,参数的字母顺序似乎是倒序的,但在实际请求数据中,它们的顺序看似随机,但始终一致。
似乎在离开 Flex 和访问网络监视器之间修改请求。我在运行时假设了一些东西。
我第一次尝试解决方案是手动创建 POST 参数字符串并将其用作参数对象。但是在那种情况下,POST 请求的正文在服务监视器中查看时是空白的。
有什么想法吗?我不知所措,担心参数顺序可能是供应商拒绝对应用程序更新进行 PCI 合规性认证的原因。
Here is a related question 提供 GET 调用的解决方案,但不是 POST 调用。
我猜你必须自己手动生成 POST 主体,并使用更底层的 URLLoader 对象而不是 HTTPService。
我会模仿 https://madssj.com/blog/2008/07/30/actionscript-3-posting-xml-data-with-urlloader/
而且,如果有人不知道原始 POST 正文是什么样子,它基本上是一个 URL 查询字符串:
使用较低级别的 API 是控制参数顺序的正确方法。这是我使用的一些示例代码。首先,创建参数字符串:
var parameters : String = '';
parameters += "firstParameter=firstOne&";
parameters += "amount=100&";
parameters += "otherParameters=Other Random Misc Data&";
parameters+= "lastParameter=LastOne";
然后,创建 URL请求:
var r:URLRequest = new URLRequest(yourURLHere);
r.data = parameters;
r.method = URLRequestMethod.POST;
r.contentType = "application/x-www-form-urlencoded";
最后,创建 URLLoader:
var l:URLLoader = new URLLoader();
l.addEventListener(Event.COMPLETE, myResultMethod);
l.addEventListener(IOErrorEvent.IO_ERROR, myFailureMethod );
l.addEventListener(SecurityErrorEvent.SECURITY_ERROR, myFailureMethod );
l.load(r);
您现在可以完全控制参数顺序。
我正在更新使用 Cairngorm 框架使用 Flex 4.15.0 和 AIR 23.0 构建的销售点系统。
该代码与我客户的支付处理器供应商提供的自定义服务器集成。我不知道其实施的任何细节。
部分要求是以特定顺序将参数发布到其服务器的形式。 Apache Flex/AIR 似乎没有保留对象参数的参数顺序。有办法吗?
更多细节,代码:
HTTPService是在Cairngorm中设置的Services.mxml:
<mx:HTTPService id="service" showBusyCursor="false" requestTimeout="240" method="post" contentType="application/x-www-form-urlencoded" url="http://localhost.:16448/" resultFormat="e4x" />
创建参数对象并调用服务方法;这是在 Cairngorm 委托中完成的:
var parameters : Object = new Object(); parameters.firstParameter = "firstOne"; parameters.amount = 100; parameters.otherParameters = "Other Random Misc Data"; parameters.lastParameter = "LastOne";
然后拨打电话:
var call : Object = this.service.send(parameters);
call.addResponder( this.responder );
Flex Framework class mx.rpc.httpAbstractOperation 将参数对象添加到传出服务调用。这从第 862 行开始。这使用 classinfo.properties 遍历属性。这似乎从我的对象中获取了按字母顺序排列的属性列表,并将它们添加到 paramsToSend 对象中:
else if (ctype == CONTENT_TYPE_FORM) { paramsToSend = {}; var val:Object; if (typeof(parameters) == "object") { //get all dynamic and all concrete properties from the parameters object var classinfo:Object = ObjectUtil.getClassInfo(parameters); for each (var p:* in classinfo.properties) { val = parameters[p]; if (val != null) { if (val is Array) paramsToSend[p] = val; else paramsToSend[p] = val.toString(); } } } else { paramsToSend = parameters; } }
查看 Flash Builder 网络监视器中的原始数据;最终请求没有按字母顺序排列的参数。
otherParameters=Other%20Random%20Misc%20Data&lastParameter=LastOne&firstParameter=firstOne&amount=100
在这个小样本中,参数的字母顺序似乎是倒序的,但在实际请求数据中,它们的顺序看似随机,但始终一致。
似乎在离开 Flex 和访问网络监视器之间修改请求。我在运行时假设了一些东西。
我第一次尝试解决方案是手动创建 POST 参数字符串并将其用作参数对象。但是在那种情况下,POST 请求的正文在服务监视器中查看时是空白的。
有什么想法吗?我不知所措,担心参数顺序可能是供应商拒绝对应用程序更新进行 PCI 合规性认证的原因。
Here is a related question 提供 GET 调用的解决方案,但不是 POST 调用。
我猜你必须自己手动生成 POST 主体,并使用更底层的 URLLoader 对象而不是 HTTPService。
我会模仿 https://madssj.com/blog/2008/07/30/actionscript-3-posting-xml-data-with-urlloader/
而且,如果有人不知道原始 POST 正文是什么样子,它基本上是一个 URL 查询字符串:
使用较低级别的 API 是控制参数顺序的正确方法。这是我使用的一些示例代码。首先,创建参数字符串:
var parameters : String = '';
parameters += "firstParameter=firstOne&";
parameters += "amount=100&";
parameters += "otherParameters=Other Random Misc Data&";
parameters+= "lastParameter=LastOne";
然后,创建 URL请求:
var r:URLRequest = new URLRequest(yourURLHere);
r.data = parameters;
r.method = URLRequestMethod.POST;
r.contentType = "application/x-www-form-urlencoded";
最后,创建 URLLoader:
var l:URLLoader = new URLLoader();
l.addEventListener(Event.COMPLETE, myResultMethod);
l.addEventListener(IOErrorEvent.IO_ERROR, myFailureMethod );
l.addEventListener(SecurityErrorEvent.SECURITY_ERROR, myFailureMethod );
l.load(r);
您现在可以完全控制参数顺序。