自定义 Angular $http 序列化器

Custom Angular $http Serializer

如何创建自定义 $http params 序列化程序。例如,假设我正在进行以下调用:

$http({
            url: settings.API_PRODUCTS,
            method: 'GET',
            params: data,
            paramSerializer: '$httpParamSerializerJQLike'
        });

如何创建一个新的自定义序列化程序以便我能够像这样使用它:

$http({
            url: settings.API_PRODUCTS,
            method: 'GET',
            params: data,
            paramSerializer: '$httpParamCustomSerializer'
        });

我检查了 httpParamSerializerJQLike 函数是如何 written,但我不确定如何像上面那样注入和使用。

根据 the documentation,您可以为 paramSerializer 属性 提供一个内联函数,或者您可以创建一个函数服务并使用字符串按名称引用它。

这应该可以,创建自定义提供程序

angular.module('yourmodule.providers').provider('$httpCustomParamSerializer', function $httpCustomParamSerializer() {

  this.$get = function() {
    return function jQueryLikeParamSerializer(params) {
      if (!params) return '';
      var parts = [];
      serialize(params, '', true);
      return parts.join('&');

    function forEachSorted(obj, iterator, context) {
        var keys = Object.keys(obj).sort();
        for (var i = 0; i < keys.length; i++) {
            iterator.call(context, obj[keys[i]], keys[i]);
        }
        return keys;
    }

    function encodeUriQuery(val, pctEncodeSpaces) {
        return encodeURIComponent(val).
                replace(/%40/gi, '@').
                replace(/%3A/gi, ':').
                replace(/%24/g, '$').
                replace(/%2C/gi, ',').
                replace(/%3B/gi, ';').
                replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
    }

    function serializeValue(v) {
    if (angular.isObject(v)) {
        return angular.isDate(v) ? v.toISOString() : angular.toJson(v);
    }
    return v;
    }   

      function serialize(toSerialize, prefix, topLevel) {
        if (toSerialize === null || angular.isUndefined(toSerialize)) return;
        if (angular.isArray(toSerialize)) {
          angular.forEach(toSerialize, function(value, index) {
            serialize(value, prefix + '[' + (angular.isObject(value) ? index : '') + ']');
          });
        } else if (angular.isObject(toSerialize) && !angular.isDate(toSerialize)) {
          forEachSorted(toSerialize, function(value, key) {
            serialize(value, prefix +
                (topLevel ? '' : '[') +
                key +
                (topLevel ? '' : ']'));
          });
        } else {
          parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize)));
        }
      }
    };
  }

});