@@ -117,7 +117,8 @@ function $HttpProvider() {
117
117
} ,
118
118
119
119
xsrfCookieName : 'XSRF-TOKEN' ,
120
- xsrfHeaderName : 'X-XSRF-TOKEN'
120
+ xsrfHeaderName : 'X-XSRF-TOKEN' ,
121
+ paramsSerializer : 'keyValue'
121
122
} ;
122
123
123
124
/**
@@ -126,6 +127,62 @@ function $HttpProvider() {
126
127
*/
127
128
var interceptorFactories = this . interceptors = [ ] ;
128
129
130
+ /**
131
+ * The URL parameters serializers
132
+ */
133
+ var paramsSerializers = this . paramsSerializers = {
134
+ keyValue : keyValueParametersSerializer ,
135
+ JSON : jsonParametersSerializer ,
136
+ nonShallowJSON : nonShallowJSONParametersSerializer ,
137
+ _default : keyValueParametersSerializer
138
+ } ;
139
+
140
+ function keyValueParametersSerializer ( params , callback ) {
141
+ forEachSorted ( params , function ( value , key ) {
142
+ if ( value === null || isUndefined ( value ) ) return ;
143
+ if ( ! isArray ( value ) ) value = [ value ] ;
144
+
145
+ forEach ( value , function ( v ) {
146
+ if ( isObject ( v ) ) {
147
+ v = toJson ( v ) ;
148
+ }
149
+ callback ( key , v ) ;
150
+ } ) ;
151
+ } ) ;
152
+ }
153
+
154
+ function jsonParametersSerializer ( params , callback ) {
155
+ forEachSorted ( params , function ( value , key ) {
156
+ if ( value === null || isUndefined ( value ) ) return ;
157
+ if ( isArray ( value ) || isObject ( value ) ) {
158
+ value = toJson ( value ) ;
159
+ }
160
+ callback ( key , value ) ;
161
+ } ) ;
162
+ }
163
+
164
+ function nonShallowJSONParametersSerializer ( params , callback ) {
165
+ function serialize ( toSerialize , prefix , topLevel ) {
166
+ if ( toSerialize === null || isUndefined ( toSerialize ) ) return ;
167
+ if ( isArray ( toSerialize ) ) {
168
+ forEach ( toSerialize , function ( value ) {
169
+ serialize ( value , prefix + '[]' ) ;
170
+ } ) ;
171
+ } else if ( isObject ( toSerialize ) ) {
172
+ forEachSorted ( toSerialize , function ( value , key ) {
173
+ serialize ( value , prefix +
174
+ ( topLevel ? '' : '[' ) +
175
+ key +
176
+ ( topLevel ? '' : ']' ) ) ;
177
+ } ) ;
178
+ } else {
179
+ callback ( prefix , toSerialize ) ;
180
+ }
181
+ }
182
+
183
+ serialize ( params , '' , true ) ;
184
+ }
185
+
129
186
this . $get = [ '$httpBackend' , '$browser' , '$cacheFactory' , '$rootScope' , '$q' , '$injector' ,
130
187
function ( $httpBackend , $browser , $cacheFactory , $rootScope , $q , $injector ) {
131
188
@@ -594,7 +651,8 @@ function $HttpProvider() {
594
651
var config = {
595
652
method : 'get' ,
596
653
transformRequest : defaults . transformRequest ,
597
- transformResponse : defaults . transformResponse
654
+ transformResponse : defaults . transformResponse ,
655
+ paramsSerializer : defaults . paramsSerializer
598
656
} ;
599
657
var headers = mergeHeaders ( requestConfig ) ;
600
658
@@ -852,7 +910,7 @@ function $HttpProvider() {
852
910
promise = deferred . promise ,
853
911
cache ,
854
912
cachedResp ,
855
- url = buildUrl ( config . url , config . params ) ;
913
+ url = buildUrl ( config . url , config . params , config . paramsSerializer ) ;
856
914
857
915
$http . pendingRequests . push ( config ) ;
858
916
promise . then ( removePendingReq , removePendingReq ) ;
@@ -939,26 +997,23 @@ function $HttpProvider() {
939
997
}
940
998
941
999
942
- function buildUrl ( url , params ) {
943
- if ( ! params ) return url ;
944
- var parts = [ ] ;
945
- forEachSorted ( params , function ( value , key ) {
946
- if ( value === null || isUndefined ( value ) ) return ;
947
- if ( ! isArray ( value ) ) value = [ value ] ;
1000
+ function buildUrl ( url , params , paramsSerializer ) {
1001
+ if ( ! params ) return url ;
948
1002
949
- forEach ( value , function ( v ) {
950
- if ( isObject ( v ) ) {
951
- v = toJson ( v ) ;
952
- }
953
- parts . push ( encodeUriQuery ( key ) + '=' +
954
- encodeUriQuery ( v ) ) ;
955
- } ) ;
956
- } ) ;
957
- if ( parts . length > 0 ) {
958
- url += ( ( url . indexOf ( '?' ) == - 1 ) ? '?' : '&' ) + parts . join ( '&' ) ;
959
- }
960
- return url ;
961
- }
1003
+ var parts = [ ] ;
1004
+ if ( ! isFunction ( paramsSerializer ) ) {
1005
+ paramsSerializer = paramsSerializers [ paramsSerializer ] ||
1006
+ paramsSerializers . _default ;
1007
+ }
1008
+
1009
+ paramsSerializer ( params , function ( key , value ) {
1010
+ parts . push ( encodeUriQuery ( key ) + '=' + encodeUriQuery ( value ) ) ;
1011
+ } ) ;
1012
+ if ( parts . length > 0 ) {
1013
+ url += ( ( url . indexOf ( '?' ) == - 1 ) ? '?' : '&' ) + parts . join ( '&' ) ;
1014
+ }
1015
+ return url ;
1016
+ }
962
1017
963
1018
964
1019
} ] ;
0 commit comments