AngularJS — использование параметра jQuery для форматирования строки запроса ресурса GET verb

У меня есть серверная часть, которая понимает строки запроса в формате jQuery $.param. Например, имея такой объект, как

{ search: "Miller", name: ["Felipe", "Fernanda"] }

Будет запрашивать URL со следующей строкой запроса:

http://theurl/path?search=Miller&name%5B%5D=Felipe&name%5B%5D=Fernanda 

В основном он использует name[]=Felipe&name[]=Fernada, но URL закодирован.

Тот же объект при анализе AngularJS имеет следующий формат:

http://theurl/path?search=Miller&name=Felipe,Fernanda

Что мой бэкэнд не понимает.

Чтение этот другой вопрос, я думал, что использование transformRequest поможет, но это не так. Вот мой тестовый код:

HTML

<div ng-controller="UserCtrl">
    <pre>{{ data | json}}</pre>
</div>

JavaScript

var myApp = angular.module('myApp',['ngResource']);

var transformFn = function(data, headersGetter) {
    console.debug('transformRequest', data);
    if (!data) return;
    console.debug('data in', data);
    var dataOut = $.param(data);
    console.debug('data out', dataOut);
    return dataOut;
};

myApp.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.transformRequest.push(transformFn);
}]);

myApp.factory('User', ['$resource', function($resource) {
    return $resource('/echo/:type/', {type:'json'}, {
        query: { method: 'GET' }
    });
}]);

myApp.controller('UserCtrl', ['$scope', 'User', function($scope, User) {
    User.query({ seach: 'Miller', name: ['Felipe', 'Fernanda']}, 
       function(data) {
           console.debug('data', data);
           $scope.data = data;
       });
}]);

Однако при попытке запустить этот код вы заметите, что атрибут данных в transformFn всегда не определен, а строка запроса остается в формате AngularJS.

Вы также можете увидеть это в jsFiddle: http://jsfiddle.net/fcoury/QKmnX/

Есть идеи, как заставить строку запроса использовать формат jQuery $.param?

EDIT: я проверял код AngularJS для ветки v1.0.x и не смог найти способ изменить код построения строки запроса, который происходит здесь:

https://github.com/angular/angular.js/blob/v1.0.x/src/ngResource/resource.js#L299-L306

Есть ли у кого-нибудь умный способ переопределить эту часть класса ngResource?


person kolrie    schedule 30.12.2012    source источник
comment
Хороший вопрос. Я думаю, вы могли бы принять предложение Иво и поместить его здесь в качестве ответа.   -  person Ramunas    schedule 08.11.2013
comment
@ Ramunas, где предложение Иво?   -  person netalex    schedule 21.01.2017


Ответы (2)


Мое простое решение:

module.run(['$http', '$httpParamSerializerJQLike', function($http, $httpParamSerializerJQLike) {
  $http.defaults.paramSerializer = $httpParamSerializerJQLike;
}]);
person Oded Niv    schedule 05.07.2015

Почему вы используете толчок? Примеры из здесь просто назначают:

$httpProvider.defaults.transformRequest = function(data) {...};
person asgoth    schedule 30.12.2012
comment
Я пробовал оба способа, это не работает, данные используются для полезной нагрузки данных POST (или PUT), а не для строк запроса. Я проверяю код AngularJS и думаю, что невозможно переопределить способ создания строки запроса. - person kolrie; 30.12.2012
comment
Хм, только что увидел, что я дал ссылку на ответ на ваш другой вопрос. Извини за это. Разве вы не можете просто использовать $hhtp вместо $resource? - person asgoth; 31.12.2012
comment
Да, я пока буду использовать $http, но было бы неплохо иметь такую ​​гибкость, я предлагаю ее здесь: groups.google.com/forum/?fromgroups=#!topic/angular/sXBeosUvSao - person kolrie; 31.12.2012