diff --git a/index.d.ts b/index.d.ts index 27dbd1a479..85bf706131 100644 --- a/index.d.ts +++ b/index.d.ts @@ -123,7 +123,7 @@ export interface ParamEncoder { } export interface CustomParamsSerializer { - (params: Record, options?: ParamsSerializerOptions): string; + (params: object, options?: ParamsSerializerOptions): string; } export interface ParamsSerializerOptions extends SerializerOptions { diff --git a/lib/core/Axios.js b/lib/core/Axios.js index b9ea3e3a2b..84410891ac 100644 --- a/lib/core/Axios.js +++ b/lib/core/Axios.js @@ -61,6 +61,13 @@ Axios.prototype.request = function request(configOrUrl, config) { var paramsSerializer = config.paramsSerializer; + if (paramsSerializer !== undefined) { + validator.assertOptions(paramsSerializer, { + encode: validators.function, + serialize: validators.function + }, true); + } + utils.isFunction(paramsSerializer) && (config.paramsSerializer = {serialize: paramsSerializer}); // filter out skipped interceptors diff --git a/lib/helpers/buildURL.js b/lib/helpers/buildURL.js index bebacb3aee..1d9bce98ab 100644 --- a/lib/helpers/buildURL.js +++ b/lib/helpers/buildURL.js @@ -35,12 +35,20 @@ module.exports = function buildURL(url, params, options) { var _encode = options && options.encode || encode; - var serializerParams = utils.isURLSearchParams(params) ? - params.toString() : - new AxiosURLSearchParams(params, options).toString(_encode); + var serializeFn = options && options.serialize; - if (serializerParams) { - url += (url.indexOf('?') === -1 ? '?' : '&') + serializerParams; + let serializedParams; + + if (serializeFn) { + serializedParams = serializeFn(params, options); + } else { + serializedParams = utils.isURLSearchParams(params) ? + params.toString() : + new AxiosURLSearchParams(params, options).toString(_encode); + } + + if (serializedParams) { + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; } return url; diff --git a/test/specs/helpers/buildURL.spec.js b/test/specs/helpers/buildURL.spec.js index 0bee3e9a05..6239c2430f 100644 --- a/test/specs/helpers/buildURL.spec.js +++ b/test/specs/helpers/buildURL.spec.js @@ -63,4 +63,20 @@ describe('helpers::buildURL', function () { it('should support URLSearchParams', function () { expect(buildURL('/foo', new URLSearchParams('bar=baz'))).toEqual('/foo?bar=baz'); }); + + it('should support custom serialize function', function () { + const params = { + x: 1 + } + + const options = { + serialize: (thisParams, thisOptions) => { + expect(thisParams).toEqual(params); + expect(thisOptions).toEqual(options); + return "rendered" + } + }; + + expect(buildURL('/foo', params, options)).toEqual('/foo?rendered'); + }); }); diff --git a/test/typescript/axios.ts b/test/typescript/axios.ts index 2bfb23c07a..60873d89a3 100644 --- a/test/typescript/axios.ts +++ b/test/typescript/axios.ts @@ -22,7 +22,8 @@ const config: AxiosRequestConfig = { params: { id: 12345 }, paramsSerializer: { indexes: true, - encode: (value) => value + encode: (value) => value, + serialize: (value, options) => String(value) }, data: { foo: 'bar' }, timeout: 10000,