From 8cf042bf87ef0cb20ff0d48b5048e4ec2e0ed4b3 Mon Sep 17 00:00:00 2001 From: Matt Sutkowski Date: Fri, 10 Jun 2022 13:19:45 -0700 Subject: [PATCH 1/2] Add `jsonContentType` to `fetchBaseQuery` options --- packages/toolkit/src/query/fetchBaseQuery.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/toolkit/src/query/fetchBaseQuery.ts b/packages/toolkit/src/query/fetchBaseQuery.ts index 96f9b711a7..577e539dae 100644 --- a/packages/toolkit/src/query/fetchBaseQuery.ts +++ b/packages/toolkit/src/query/fetchBaseQuery.ts @@ -38,7 +38,7 @@ const defaultValidateStatus = (response: Response) => response.status >= 200 && response.status <= 299 const defaultIsJsonContentType = (headers: Headers) => - /*applicat*//ion\/(vnd\.api\+)?json/.test(headers.get('content-type') || '') + /*applicat*/ /ion\/(vnd\.api\+)?json/.test(headers.get('content-type') || '') const handleResponse = async ( response: Response, @@ -132,6 +132,10 @@ export type FetchBaseQueryArgs = { * ``` */ isJsonContentType?: (headers: Headers) => boolean + /** + * Defaults to `application/json`; + */ + jsonContentType?: string } & RequestInit export type FetchBaseQueryMeta = { request: Request; response?: Response } @@ -171,10 +175,11 @@ export type FetchBaseQueryMeta = { request: Request; response?: Response } * * @param {(params: Record) => string} paramsSerializer * An optional function that can be used to stringify querystring parameters. - * + * * @param {(headers: Headers) => boolean} isJsonContentType * An optional predicate function to determine if `JSON.stringify()` should be called on the `body` arg of `FetchArgs` - + * + * @param {string} jsonContentType Defaults to `application/json`. Used when automatically setting the content-type header for a request with a jsonifiable body that does not have an explicit content-type header. */ export function fetchBaseQuery({ baseUrl, @@ -182,6 +187,7 @@ export function fetchBaseQuery({ fetchFn = defaultFetchFn, paramsSerializer, isJsonContentType = defaultIsJsonContentType, + jsonContentType = 'application/json', ...baseFetchOptions }: FetchBaseQueryArgs = {}): BaseQueryFn< string | FetchArgs, @@ -229,7 +235,7 @@ export function fetchBaseQuery({ typeof body.toJSON === 'function') if (!config.headers.has('content-type') && isJsonifiable(body)) { - config.headers.set('content-type', 'application/json') + config.headers.set('content-type', jsonContentType) } if (body && isJsonContentType(config.headers)) { From 4ac95595f652753cceff49b260c590223f80f57f Mon Sep 17 00:00:00 2001 From: Matt Sutkowski Date: Fri, 10 Jun 2022 13:27:08 -0700 Subject: [PATCH 2/2] Add a test --- packages/toolkit/src/query/fetchBaseQuery.ts | 2 +- .../src/query/tests/fetchBaseQuery.test.tsx | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/toolkit/src/query/fetchBaseQuery.ts b/packages/toolkit/src/query/fetchBaseQuery.ts index 577e539dae..977cedd4be 100644 --- a/packages/toolkit/src/query/fetchBaseQuery.ts +++ b/packages/toolkit/src/query/fetchBaseQuery.ts @@ -38,7 +38,7 @@ const defaultValidateStatus = (response: Response) => response.status >= 200 && response.status <= 299 const defaultIsJsonContentType = (headers: Headers) => - /*applicat*/ /ion\/(vnd\.api\+)?json/.test(headers.get('content-type') || '') + /*applicat*//ion\/(vnd\.api\+)?json/.test(headers.get('content-type') || '') const handleResponse = async ( response: Response, diff --git a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx index 46416e4052..9fd3cbc83e 100644 --- a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx +++ b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx @@ -292,6 +292,27 @@ describe('fetchBaseQuery', () => { expect(request.headers['content-type']).toBe('text/html') expect(request.body).toEqual(data.join(',')) }) + + it('supports a custom jsonContentType', async () => { + const baseQuery = fetchBaseQuery({ + baseUrl, + fetchFn: fetchFn as any, + jsonContentType: 'application/vnd.api+json', + }) + + let request: any + ;({ data: request } = await baseQuery( + { + url: '/echo', + body: {}, + method: 'POST', + }, + commonBaseQueryApi, + {} + )) + + expect(request.headers['content-type']).toBe('application/vnd.api+json') + }) }) describe('arg.params', () => { @@ -408,9 +429,11 @@ describe('fetchBaseQuery', () => { baseUrl, fetchFn: fetchFn as any, isJsonContentType: (headers) => - ['application/vnd.api+json', 'application/json', 'application/vnd.hal+json'].includes( - headers.get('content-type') ?? '' - ), + [ + 'application/vnd.api+json', + 'application/json', + 'application/vnd.hal+json', + ].includes(headers.get('content-type') ?? ''), }) let request: any