AngularJS - 如何为查询字符串设置transformParams

时间:2014-04-11 09:46:58

标签: javascript angularjs httprequest

我尝试使用以下代码正确编码角度上的查询参数:

getAccount = function (accountEmail, accountCreationDate) {

      var data = {
        accountEmail: accountEmail,
        accountCreationDate: accountCreationDate
      };

      return $http.get('/administration/account.json', {params: $filter('noBlankValues')(data)}).then(
        function (result) {
          $log.debug('getAccount result: ' + JSON.stringify(result.data));
          return result.data.result;
        }
      );
    };

accountCreationDate是ISO-8601字符串(例如" 2014-03-20T14:56:01.691 + 01:00")。根据{{​​3}}我将params作为一个对象,但在框架中,我有以下几个"奇怪的"查询输出:

?accountCreationDate=2014-03-20T14:56:01.691%2B01:00&accountEmail=test@test.com

即。日期' +'是编码但不是对象的其余部分。你知道出了什么问题以及如何解决这个问题吗?

PS:我知道我可以手动编写编码的查询字符串,但我正在寻找一种更加用户友好的解决方案。

1 个答案:

答案 0 :(得分:1)

好的,这是通过使用以下转换函数解决的:

var transform = function () {
      headers: {
        'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
      },
      transformRequest: function (obj) {
        var str = [];
        for (var p in obj) {
          if ((typeof obj[p] !== 'undefined') &&
            (typeof obj[p] !== 'function')) {

            if (obj[p] instanceof Date) {
              str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p].toISOString()));
            }
            else if (obj[p] instanceof Array) {
              for (var i in obj[p]) {
                if (obj[p][i] instanceof Object) {
                  str.push(encodeURIComponent(p) + '=' + encodeURIComponent(JSON.stringify(obj[p][i])));
                } else {
                  str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p][i]));
                }
              }
            }
            else if (obj[p] instanceof Object) {
              str.push(encodeURIComponent(p) + '=' + encodeURIComponent(JSON.stringify(obj[p])));
            }
            else {
              str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
            }
          }
        }
        return str.join('&');
      }
    }
};