diff --git a/lib/defaults.js b/lib/defaults.js index fb96bdbd13..72c5a0eda2 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -58,6 +58,14 @@ var defaults = { } if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) { setContentTypeIfUnset(headers, 'application/json'); + if (utils.isString(data)) { + try { + JSON.parse(data); + return data; + } catch (e) { + return JSON.stringify(data); + } + } return JSON.stringify(data); } return data; diff --git a/test/specs/defaults.spec.js b/test/specs/defaults.spec.js index d71cd66a4e..ab5dcff1aa 100644 --- a/test/specs/defaults.spec.js +++ b/test/specs/defaults.spec.js @@ -20,6 +20,18 @@ describe('defaults', function () { expect(defaults.transformRequest[0]({foo: 'bar'})).toEqual('{"foo":"bar"}'); }); + it("should also transform request json when 'Content-Type' is 'application/json'", function () { + expect(defaults.transformRequest[0](42, { + 'Content-Type': 'application/json' + })).toEqual('42'); + expect(defaults.transformRequest[0]('bar', { + 'Content-Type': 'application/json' + })).toEqual('"bar"'); + expect(defaults.transformRequest[0](JSON.stringify({foo: 'bar'}), { + 'Content-Type': 'application/json' + })).toEqual('{"foo":"bar"}'); + }); + it('should do nothing to request string', function () { expect(defaults.transformRequest[0]('foo=bar')).toEqual('foo=bar'); });