feat: api 发送适配器支持通过 api.query 来修改 query 参数 Close: #9813

This commit is contained in:
2betop 2024-05-16 17:04:26 +08:00
parent 3eacf028e8
commit 1afa7ad532
3 changed files with 23 additions and 1 deletions

View File

@ -589,11 +589,14 @@ amis 的 API 配置,如果无法配置出你想要的请求结构,那么可
- **api**:当前请求的 api 对象,一般包含下面几个属性:
- url当前接口 Api 地址
- method当前请求的方式
- data请求的数据体
- data请求的数据体, 注意当请求方式为 `get` 时,`data` 在传入适配器时会被删除,请通过 query 读取,或者修改
- query请求的查询参数所有请求参数都会被合并到 query 中,包含 data 参数和 url 参数
- headers请求的头部信息
- context: 发送请求时的上下文数据
- **context** 发送请求时的上下文数据
> 6.5.0 版本开始支持在发送适配中修改 query 参数,之前的版本只能修改 url 参数。
##### 字符串形式
如果在 JSON 文件中配置的话,`requestAdaptor`只支持字符串形式。

View File

@ -221,6 +221,7 @@ export interface ApiObject extends BaseApiObject {
withCredentials?: boolean;
cancelExecutor?: (cancel: Function) => void;
};
originUrl?: string; // 原始的 url 地址,记录将 data 拼接到 query 之前的地址
jsonql?: any;
graphql?: string;
operationName?: string;

View File

@ -21,6 +21,8 @@ import isPlainObject from 'lodash/isPlainObject';
import {debug, warning} from './debug';
import {evaluate} from 'amis-formula';
import {memoryParse} from './memoryParse';
import cloneDeep from 'lodash/cloneDeep';
import isEqual from 'lodash/isEqual';
const rSchema =
/(?:^|raw\:)(get|post|put|delete|patch|options|head|jsonp|js):/i;
@ -155,6 +157,7 @@ export function buildApi(
ctx: Record<string, any>,
merge: boolean
) => {
apiObject.originUrl = apiObject.originUrl || apiObject.url;
const idx = apiObject.url.indexOf('?');
if (~idx) {
const params = (apiObject.query = {
@ -482,7 +485,22 @@ export function wrapFetcher(
if (api.requestAdaptor) {
debug('api', 'before requestAdaptor', api);
const originQuery = api.query;
const originQueryCopy = isPlainObject(api.query)
? cloneDeep(api.query)
: api.query;
api = (await api.requestAdaptor(api, data)) || api;
if (
api.query !== originQuery ||
(isPlainObject(api.query) && !isEqual(api.query, originQueryCopy))
) {
// 如果 api.data 有变化,且是 get 请求,那么需要重新构建 url
const idx = api.url.indexOf('?');
api.url = `${~idx ? api.url.substring(0, idx) : api.url}?${qsstringify(
api.query
)}`;
}
debug('api', 'after requestAdaptor', api);
}