代码之家  ›  专栏  ›  技术社区  ›  Marty Pitt

flex防止使用httpRequest对参数进行URL编码

  •  0
  • Marty Pitt  · 技术社区  · 15 年前

    我正在尝试将现有的Ajax应用程序移植到flex,但在对发送到后端服务的参数进行编码时遇到了问题。

    当试图执行删除联系人的操作时,现有的应用程序执行一个POST,发送以下内容:(用Firebug捕获)

    contactRequest.contacts[0].contactId=2c33ddc6012a100096326b40a501ec72
    

    因此,我创建了以下代码:

    var service:HTTPService;
    function initalizeService():void
    {
         service = new HTTPService();
         service.url = "http://someservice";
         service.method = 'POST';
     }
    public function sendReq():void
    {
        var params:Object = new Object();
    params['contactRequest.contacts[0].contactId'] = '2c33ddc6012a100097876b40a501ec72';
        service.send(params);
    }
    

    在Firebug中,我看到这个消息如下:

    Content-type: application/x-www-form-urlencoded
    Content-length: 77
    
    contactRequest%2Econtacts%5B0%5D%2EcontactId=2c33ddc6012a100097876b40a501ec72
    

    flex是在发送参数之前对其进行URL编码的,我们从服务器收到一个返回的错误。

    如何在不使用URL编码的情况下禁用此编码并按原样发送参数?

    我感觉像 contentType 属性应该是键,但定义的值都不起作用。

    另外,我也考虑过写一篇 SerializationFilter 但这似乎有点过分杀伤力——有更简单的方法吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Marty Pitt    15 年前

    写一个序列化过滤器似乎可以做到这一点:

    public class MyFilter extends SerializationFilter
    {
        public function MyFilter()
        {
            super();
        }
        override public function serializeBody(operation:AbstractOperation, obj:Object):Object
        {
            var s:String = "";
            var classinfo:Object = ObjectUtil.getClassInfo(obj);
    
            for each (var p:* in classinfo.properties)
            {
                var val:* = obj[p];
                if (val != null)
                {
                    if (s.length > 0)
                        s += "&";
                    s += StringUtil.substitute("{0}={1}",p,val);
                }
            }
            return s;
        }
    }
    

    我很想知道任何其他的解决方案,但不包括这样做!

    推荐文章