如何在 Redux Toolkit Query 中定义通用查询参数
How to define common query params in Redux Toolkit Query
我正在处理的 API 的所有端点都需要同一组查询参数。在向端点发出请求之前,用户必须select这些参数。
端点示例
/api/resource-1?param1=valueA¶m2=valueB¶m3=valueC
/api/resource-2?param1=valueA¶m2=valueB¶m3=valueC
所选值保存在 Redux 商店中。我想自定义我的 baseQuery 以自动将这些查询参数附加到 API URL。我正在 fetchBaseQuery
中搜索类似于 prepareHeaders
的内容,允许自定义查询 URL.
假设代码
const baseQuery = fetchBaseQuery({
baseUrl: baseUrl,
// THIS PROPERTY DOES NOT EXISTS
prepareUrl: (url, { getState }) => {
const param1 = (getState() as AppState).config.param;
if (param1) {
url.searchParams.append('param1', param1);
}
return url;
},
prepareHeaders: (headers, { getState }) => {
const token = (getState() as AppState).auth.token;
if (token) {
headers.set('authorization', `Bearer ${token}`);
}
return headers;
},
});
我阅读了如何 implement a custom base query 但我不想失去 fetchBaseQuery
提供的行为。
是否有类似 prepareUrl
属性 的东西允许自定义请求 URL?我应该实施自定义基本查询吗?最好的方法是什么?
您已经在文档的正确页面上了。诀窍是不编写全新的 baseQuery,而是将自定义 baseQuery“围绕”现有实现。 This examples shows how to do that to get a dynamic baseUrl,这应该非常接近你想在这里做的事情。
这是我最终得到的自定义查询代码:
import { fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { FetchArgs } from '@reduxjs/toolkit/dist/query/fetchBaseQuery'
import { BaseQueryApi } from '@reduxjs/toolkit/dist/query/baseQueryTypes';
import { RootState } from '../store';
const customQuery = async (args: string | FetchArgs, api: BaseQueryApi, extraOptions: {}) => {
args = appendQueryStringParam(args, "Source", "Desktop");
args = appendQueryStringParam(args, "LoginToken", "XYZ");
return await fetchBaseQuery({ baseUrl: 'http://example.com/api' })(args, api, extraOptions);
}
function appendQueryStringParam(args: string | FetchArgs, key: string, value: string): string | FetchArgs {
let urlEnd = typeof args === 'string' ? args : args.url;
if (urlEnd.indexOf('?') < 0)
urlEnd += '?';
else
urlEnd += '&';
urlEnd += `${key}=${value}`;
return typeof args === 'string' ? urlEnd : { ...args, url: urlEnd };
}
export default customQuery;
我正在处理的 API 的所有端点都需要同一组查询参数。在向端点发出请求之前,用户必须select这些参数。
端点示例
/api/resource-1?param1=valueA¶m2=valueB¶m3=valueC
/api/resource-2?param1=valueA¶m2=valueB¶m3=valueC
所选值保存在 Redux 商店中。我想自定义我的 baseQuery 以自动将这些查询参数附加到 API URL。我正在 fetchBaseQuery
中搜索类似于 prepareHeaders
的内容,允许自定义查询 URL.
假设代码
const baseQuery = fetchBaseQuery({
baseUrl: baseUrl,
// THIS PROPERTY DOES NOT EXISTS
prepareUrl: (url, { getState }) => {
const param1 = (getState() as AppState).config.param;
if (param1) {
url.searchParams.append('param1', param1);
}
return url;
},
prepareHeaders: (headers, { getState }) => {
const token = (getState() as AppState).auth.token;
if (token) {
headers.set('authorization', `Bearer ${token}`);
}
return headers;
},
});
我阅读了如何 implement a custom base query 但我不想失去 fetchBaseQuery
提供的行为。
是否有类似 prepareUrl
属性 的东西允许自定义请求 URL?我应该实施自定义基本查询吗?最好的方法是什么?
您已经在文档的正确页面上了。诀窍是不编写全新的 baseQuery,而是将自定义 baseQuery“围绕”现有实现。 This examples shows how to do that to get a dynamic baseUrl,这应该非常接近你想在这里做的事情。
这是我最终得到的自定义查询代码:
import { fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { FetchArgs } from '@reduxjs/toolkit/dist/query/fetchBaseQuery'
import { BaseQueryApi } from '@reduxjs/toolkit/dist/query/baseQueryTypes';
import { RootState } from '../store';
const customQuery = async (args: string | FetchArgs, api: BaseQueryApi, extraOptions: {}) => {
args = appendQueryStringParam(args, "Source", "Desktop");
args = appendQueryStringParam(args, "LoginToken", "XYZ");
return await fetchBaseQuery({ baseUrl: 'http://example.com/api' })(args, api, extraOptions);
}
function appendQueryStringParam(args: string | FetchArgs, key: string, value: string): string | FetchArgs {
let urlEnd = typeof args === 'string' ? args : args.url;
if (urlEnd.indexOf('?') < 0)
urlEnd += '?';
else
urlEnd += '&';
urlEnd += `${key}=${value}`;
return typeof args === 'string' ? urlEnd : { ...args, url: urlEnd };
}
export default customQuery;