diff --git a/package.json b/package.json index cb991ad..4bca3b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/query", - "version": "0.0.13", + "version": "0.0.14", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/adapter.ts b/src/adapter.ts index 37efd11..5adbd09 100644 --- a/src/adapter.ts +++ b/src/adapter.ts @@ -1,8 +1,11 @@ -type AdapterOpts = { +export const methods = ['GET', 'POST'] as const; +export type Method = (typeof methods)[number]; +export type AdapterOpts = { url: string; headers?: Record; body?: Record; timeout?: number; + method?: Method; }; /** @@ -18,16 +21,21 @@ export const adapter = async (opts: AdapterOpts, overloadOpts?: RequestInit) => const timer = setTimeout(() => { controller.abort(); }, timeout); - - return fetch(opts.url, { - method: 'POST', + let method = overloadOpts?.method || opts.method || 'POST'; + let url = new URL(opts.url, window.location.origin); + const isGet = method === 'GET'; + if (isGet) { + url.search = new URLSearchParams(opts.body).toString(); + } + return fetch(url, { + method: method.toUpperCase(), headers: { 'Content-Type': 'application/json', ...opts.headers, }, - body: JSON.stringify(opts.body), signal, ...overloadOpts, + body: isGet ? undefined : JSON.stringify(opts.body), }) .then((response) => { // 获取 Content-Type 头部信息 diff --git a/src/query.ts b/src/query.ts index ae4fa3c..dfd0436 100644 --- a/src/query.ts +++ b/src/query.ts @@ -1,4 +1,4 @@ -import { adapter } from './adapter.ts'; +import { adapter, Method } from './adapter.ts'; /** * 请求前处理函数 * @param opts 请求配置 @@ -17,6 +17,8 @@ export type QueryOpts = { adapter?: typeof adapter; headers?: Record; timeout?: number; + method?: Method; + [key: string]: any; }; export type Data = { path?: string; @@ -76,7 +78,7 @@ export const setBaseResponse = (res: Result) => { export class Query { adapter: typeof adapter; url: string; - beforeRequest?: Fn; + beforeRequest?: DataOpts['beforeRequest']; afterResponse?: DataOpts['afterResponse']; headers?: Record; timeout?: number; @@ -120,20 +122,22 @@ export class Query { */ async post(body: Data & P, options?: DataOpts): Promise> { const url = options?.url || this.url; - const headers = { ...this.headers, ...options?.headers }; - const adapter = options?.adapter || this.adapter; - const beforeRequest = options?.beforeRequest || this.beforeRequest; - const afterResponse = options?.afterResponse || this.afterResponse; - const timeout = options?.timeout || this.timeout; + const { headers, adapter, beforeRequest, afterResponse, timeout, ...rest } = options || {}; + const _headers = { ...this.headers, ...headers }; + const _adapter = adapter || this.adapter; + const _beforeRequest = beforeRequest || this.beforeRequest; + const _afterResponse = afterResponse || this.afterResponse; + const _timeout = timeout || this.timeout; const req = { url: url, - headers: headers, + headers: _headers, body, - timeout, + timeout: _timeout, + ...rest, }; try { - if (beforeRequest) { - await beforeRequest(req); + if (_beforeRequest) { + await _beforeRequest(req); } } catch (e) { console.error('request beforeFn error', e, req); @@ -160,11 +164,11 @@ export class Query { }, 1000); }); } - return adapter(req).then(async (res) => { + return _adapter(req).then(async (res) => { try { setBaseResponse(res); - if (afterResponse) { - return await afterResponse(res, { + if (_afterResponse) { + return await _afterResponse(res, { req, res, fetch: adapter, @@ -187,14 +191,14 @@ export class Query { * 请求前处理,设置请求前处理函数 * @param fn 处理函数 */ - before(fn: Fn) { + before(fn: DataOpts['beforeRequest']) { this.beforeRequest = fn; } /** * 请求后处理,设置请求后处理函数 * @param fn 处理函数 */ - after(fn: (result: Result, req?: any) => Promise) { + after(fn: DataOpts['afterResponse']) { this.afterResponse = fn; } }