apache-flex 我可以控制HTTP Service Post中的参数顺序吗?

laik7k3q  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(127)

我正在更新一个销售点系统,该系统是使用Flex 4.15.0和AIR 23.0并使用Cairngorm框架构建的。
该代码与我客户的支付处理器供应商提供的自定义服务器集成。我不知道其实现的任何细节。
部分要求是参数以特定的顺序发布到服务器。Apache Flex / AIR似乎没有保留对象参数的参数顺序。有办法做到这一点吗?
更详细的说明,代码:

  1. HTTP服务在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"
            />

1.创建一个参数对象,调用服务方法;这是在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 );
  1. Flex Framework类mx.rpc.httpAbstractOperation将parameters对象添加到传出的服务调用中。这从第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;
    }
}

1.查看Flash Builder网络监视器中的原始数据;最后的请求没有按字母顺序排列参数。

otherParameters=Other%20Random%20Misc%20Data&lastParameter=LastOne&firstParameter=firstOne&amount=100

在这个小样本中,参数看起来是按字母顺序排列的,但在实际的请求数据中,它们看起来是随机的--但总是一致的--顺序。
在离开Flex和点击网络监视器之间似乎有什么东西在修改请求。我假设在运行时有什么东西。
我第一次尝试的解决方案是手动创建POST参数字符串,并将其用作参数对象。然而,在这种情况下,当在服务监视器中查看POST请求时,POST请求的主体是空白的。
有什么想法吗?我很困惑,担心参数顺序可能是供应商拒绝应用程序更新的PCI合规性认证的原因。
Here is a related question,提供GET呼叫的解决方案,但不提供POST呼叫的解决方案。

lrpiutwd

lrpiutwd1#

我的猜测是您必须自己手动生成POST主体,并使用更低级的URLLoader对象而不是HTTPService。
我会从https://madssj.com/blog/2008/07/30/actionscript-3-posting-xml-data-with-urlloader/中取一个模式
而且,如果有人不知道原始POST主体是什么样子的话,它基本上就是一个URL查询字符串:How are parameters sent in an HTTP POST request?
使用较低级别的API是控制参数顺序的正确方法。下面是我使用的一些示例代码。首先,创建参数字符串:

var parameters : String = '';
parameters += "firstParameter=firstOne&";
parameters += "amount=100&";
parameters += "otherParameters=Other Random Misc Data&";
parameters+= "lastParameter=LastOne";

然后,创建URLRequest:

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);

您现在可以完全控制参数顺序。
My blog post on this topic

相关问题