收藏
回答

wx.request 普通表单无法提交数组

框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小程序 Bug wx.request 微信iOS客户端 86. 1.9.9

'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'

当使用表单方式提交的时候,无法像浏览器一样传输数组。希望尽快修复。


wx.request({
    url: xxx, //仅为示例,并非真实的接口地址
    data: {
        "rs": "login",
        "rsargs": [ 'aaa',1 ]
    },
    method: "POST",
    header: {
        'content-type': 'application/x-www-form-urlencoded'
    },
    success: function (res) {
      
    }
})

请求的格式是下面这样的



正常浏览器是这样的

回答关注问题邀请回答
收藏

2 个回答

  • 微信号
    微信号
    2018-07-02

    估计你和我遇到的问题是一样的。

    解决方法,使用jquery的param方法 包装参数就好了

    1. header配置为 x-www-formxxxxx....


    2. 包装参数


    reqData = this._param(reqData);

    其中 _param 就是 jquery的$.param方法 copy过来就好。

    _param: function (a, traditional) {
            var class2type = {};
            var toString = class2type.toString;
            var hasOwn = class2type.hasOwnProperty;
     
            function toType(obj) {
                if (obj == null) {
                    return obj + "";
                }
                // Support: Android <=2.3 only (functionish RegExp)
                return typeof obj === "object" || typeof obj === "function" ?
                    class2type[toString.call(obj)] || "object" :
                    typeof obj;
            }
     
            var isFunction = function isFunction(obj) {
                // Support: Chrome <=57, Firefox <=52
                // In some browsers, typeof returns "function" for HTML <object> elements
                // (i.e., `typeof document.createElement( "object" ) === "function"`).
                // We don't want to classify *any* DOM node as a function.
                return typeof obj === "function" && typeof obj.nodeType !== "number";
            };
     
            var
                rbracket = /\[\]$/,
                rCRLF = /\r?\n/g,
                rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
                rsubmittable = /^(?:input|select|textarea|keygen)/i;
     
            function buildParams(prefix, obj, traditional, add) {
                var name;
     
                if (Array.isArray(obj)) {
     
                    // Serialize array item.
                    obj.forEach(function (v, i) {
                        if (traditional || rbracket.test(prefix)) {
     
                            // Treat each array item as a scalar.
                            add(prefix, v);
     
                        } else {
     
                            // Item is non-scalar (array or object), encode its numeric index.
                            buildParams(
                                prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
                                v,
                                traditional,
                                add
                            );
                        }
                    });
     
                } else if (!traditional && toType(obj) === "object") {
     
                    // Serialize object item.
                    for (name in obj) {
                        buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
                    }
     
                } else {
     
                    // Serialize scalar item.
                    add(prefix, obj);
                }
            }
     
            // Serialize an array of form elements or a set of
            // key/values into a query string
            var param = function (a, traditional) {
                var prefix,
                    s = [],
                    add = function (key, valueOrFunction) {
     
                        // If value is a function, invoke it and use its return value
                        var value = isFunction(valueOrFunction) ?
                            valueOrFunction() :
                            valueOrFunction;
     
                        s[s.length] = encodeURIComponent(key) + "=" +
                            encodeURIComponent(value == null ? "" : value);
                    };
     
                // If an array was passed in, assume that it is an array of form elements.
                if (Array.isArray(a)) {
     
                    // Serialize the form elements
                    a.forEach(function (item) {
                        add(item.name, item.value);
                    });
     
                } else {
     
                    // If traditional, encode the "old" way (the way 1.3.2 or older
                    // did it), otherwise encode params recursively.
                    for (prefix in a) {
                        buildParams(prefix, a[prefix], traditional, add);
                    }
                }
     
                // Return the resulting serialization
                return s.join("&");
            };
            return param(a, traditional);
        },

    偷个懒 直接copy粘贴过来 试试吧,我这边测试没有问题


    2018-07-02
    有用 3
    回复 1
    • Remx
      Remx
      2021-10-15
      亲测有用,专门登录上来给你点赞
      2021-10-15
      回复
  • 卢霄霄
    卢霄霄
    2018-06-20


    把数组用 JSON.stringify转化成字符串吧

    2018-06-20
    有用 1
    回复
登录 后发表内容