我可以在HTTPService帖子中控制参数顺序吗?

时间:2017-07-05 11:22:47

标签: post flex httpservice

我正在使用Cairngorm框架更新使用Flex 4.15.0和AIR 23.0构建的销售点系统。

该代码与我客户的支付处理器供应商提供的自定义服务器集成。我不知道其实施的任何细节。

部分要求是参数以特定顺序张贴到其服务器。 Apache Flex / AIR似乎不保留对象参数的参数顺序。有办法吗?

更多细节,代码:

  1. 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"
                /> 
    
  2. 创建参数对象并调用服务方法;这是在Cairngorm代表中完成的:

    var parameters : Object = new Object();
    parameters.firstParameter  = "firstOne";
    parameters.amount = 100;
    parameters.otherParameters = "Other Random Misc Data";
    parameters.lastParameter = "LastOne";
    
  3. 然后拨打电话:

    var call : Object    = this.service.send(parameters);
    call.addResponder( this.responder ); 
    
    1. Flex Framework类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;
          }
      }
      
    2. 查看Flash Builder网络监视器中的原始数据;最终请求没有按字母顺序排列参数。

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

      使用这个小样本,看起来参数是反向字母顺序,但是对于实际的请求数据,它们看起来是随机的 - 但总是一致的 - 顺序。

    3. 似乎正在修改离开Flex和点击网络监视器之间的请求。我在运行时假设一些东西。

      我首次尝试解决方案是手动创建POST参数字符串并将其用作参数对象。但是,在这种情况下,POST请求的主体在服务监视器中查看时是空白的。

      有什么想法吗?我感到茫然,并担心参数订单可能是供应商拒绝对应用程序更新进行PCI合规性认证的原因。

      Here is a related question提供了GET调用的解决方案,但不提供POST调用。

1 个答案:

答案 0 :(得分:2)

我的猜测是你必须自己手动生成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