import type { Any } from '@web-io/common/es/types'; import type { Options } from '@web-io/common/es/types/http'; import type { IError } from '../../types/mini'; /** * 请求方法. */ declare type Method = 'GET' | 'POST' | 'PUT' | 'DELETE'; /** * 期望返回的数据格式. */ declare type DataType = 'json' | 'text' | 'base64' | 'arraybuffer'; /** * HTTP请求头,该对象里面的key和value必须是String类型. */ interface Headers { 'content-type'?: string; [key: string]: string | undefined; } /** * 发送请求前对请求数据进行转换,跟在拦截器中修改请求选项`data`区别是可以不直接修改用户传递的原始`data`,比如返回一个深拷贝的数据。 * 原始数据来源于请求选项`data`,以最后一个转换函数的返回数据作为最终请求数据,如果无返回数据则不会发送请求数据。 * 可用于统一转换网关数据格式,或者添加统一header字段。 */ interface TransformRequest< /** * 转换之后的数据类型. */ TransformedData = unknown, /** * 原始数据类型,原始数据来源`data`. */ SourceData = RequestConfig['data'], /** * 请求头类型. */ THeaders = Headers> { (data: SourceData | undefined, headers: THeaders, options: Readonly): TransformedData; } /** * 请求配置. * * @see https://opendocs.alipay.com/mini/api/owycmh#%E5%85%A5%E5%8F%82 */ interface RequestConfig extends Pick { /** * request url, 如果不设定会从`baseUrl`获取. 如果url固定可统一设置`baseUrl`当做url. */ url?: string; /** * url prefix, 可以为fullurl或者absolute url, 尾部斜线为可选. 如果`url`为fullurl则忽略`baseUrl`. */ baseUrl?: string; /** * 设置请求的 HTTP 头对象,默认 {'content-type': 'application/json;charset=UTF-8'},该对象里面的 key 和 value 必须是 String 类型。 */ headers?: Headers; /** * 默认 GET,目前支持 GET/POST/PUT/DELETE。 */ method?: Method; /** * 发送给服务器的数据. 传给服务器的数据最终会是 String 类型,如果 data 不是 String 类型,会被转换成 String 。转换规则如下: * 若方法为 GET,会将数据转换成 query string. 若方法为 POST 且 headers['content-type'] 为 application/json ,会对数据进行 JSON 序列化。 * 若方法为 POST 且 headers['content-type'] 为 application/x-www-form-urlencoded ,会将数据转换成 query string. */ data?: Record; /** * 请求超时时间, 单位ms, 默认30s. */ timeout?: number; /** * 期望返回的数据格式,默认 JSON,支持 JSON、text、base64、arraybuffer(10.1.70 版本开始支持)。 */ dataType?: DataType; /** * 网络中断提示,默认`true`. */ networkTip?: boolean; /** * 是否显示loading,默认`true`. * 传递函数可自定义loading, 函数返回值为函数用于关闭loading. */ loading?: boolean | ((options: RequestConfig) => (options: RequestConfig) => void); /** * 额外参数,可在拦截器中使用. */ extra?: Record; /** * 发送请求前对请求数据进行转换,跟在拦截器中修改请求选项`data`区别是可以不直接修改用户传递的原始`data`,比如返回一个深拷贝的数据。 * 原始数据来源于请求选项`data`,以最后一个转换函数的返回数据作为最终请求数据,如果无返回数据则不会发送请求数据。 * 可用于统一转换网关数据格式,或者添加统一header字段。 */ transformRequest?: null | TransformRequest | TransformRequest[]; } /** * 原始响应, `my.IHttpRequestSuccessResult`泛型参数支持. * * @template D 原始数据类型. */ interface RawResponse { /** * 响应码, 同HTTP状态码, 成功状态下为`200`. */ readonly status?: number; /** * 响应头. */ readonly headers?: Readonly>; /** * 响应数据,格式取决于请求时的`dataType`参数. */ readonly data?: D; } /** * response数据模板. * * @template D Type of 业务数据. */ interface ResponseTemplate { /** * 通用代码,用于判断业务数据是否请求成功. */ code: number; /** * 成功或者失败消息. */ msg?: string | null; /** * 业务数据. */ data: D; } /** * 请求拦截器. * * @see https://github.com/umijs/umi-request#interceptor */ declare type RequestInterceptor = ( /** * 实际fullurl, 可能为`options.baseUrl`和`options.url`拼接. * 注意:url和options.url可能会不一样, 因为options.url可以为pathname或者fullurl. * 拦截器中也可以对其修改,后面的拦截器会拿到前面修改后的值. */ url: string, /** * 请求配置. */ options: RequestConfig) => { /** * 如果不返回url则继续使用之前的值. */ url?: string; /** * 如果不返回options,继续使用之前的options. */ options?: RequestConfig; } | Promise<{ url?: string; options?: RequestConfig; }> | Promise | void; /** * 响应拦截器. * * @template D 原始数据类型. * @see https://github.com/umijs/umi-request#interceptor */ declare type ResponseInterceptor = ( /** * 原始响应. */ response: RawResponse, /** * 请求配置. */ options: RequestConfig, /** * 实际请求完整url. */ url: string) => RawResponse | Promise>; /** * 响应拦截器, 内部使用, 内部执行拦截器函数时传递泛型类型推导原始数据类型. */ declare type DefaultResponseInterceptor = ( /** * 原始响应. */ response: RawResponse, /** * 请求配置. */ options: RequestConfig, /** * 实际请求完整url. */ url: string) => RawResponse | Promise>; /** * 下一个中间件接口. * * @template T 返回值类型. */ interface NextMiddleware { (options: RequestConfig): IAbortablePromise; } /** * 中间件接口,中间件跟拦截器不同的是可以作用于同一次请求和响应,可用来实现请求重试、登录拦截等。 * 中间件执行时机为请求拦截器之前响应拦截器之后,可以捕获请求响应中的错误,可以修改返回数据。 * 外部必须执行next才可以串接后续流程,第一个next为处理处理响应的函数, * 也就是外部中间件中获取下一个中间件的返回值为业务数据,如果设置`resp`为true后`[BizData, RawData, RawResponse]`。 * 中间件返回的数据会直接到`then`方法中,如果不处理业务数据可直接返回next的执行结果。 * * @template T 返回值类型. * @template NT 下一个中间件返回值类型. */ interface Middleware { /** * @param options 请求选项. * @param next 下一个中间件函数,外部必须执行next才可以串接后续流程,第一个next为处理处理响应的函数, * 也就是外部中间件中获取下一个中间件的返回值为业务数据,如果设置`resp`为true后`[BizData, RawData, RawResponse]`。 * 中间件返回的数据会直接到`then`方法中,如果不处理业务数据可直接返回next的执行结果。 */ (options: RequestConfig, next: NextMiddleware): Promise; } /** * 同`Middleware`,内部使用。返回值为`IAbortablePromise`扩展了`abort`方法,默认定义了`finally`(不依赖ts lib配置, es2018才支持 finally)。 */ interface DefaultMiddleware { /** * @param options 请求选项. * @param next 下一个中间件函数,外部必须执行next才可以串接后续流程,第一个next为处理处理响应的函数, * 也就是外部中间件中获取下一个中间件的返回值为业务数据,如果设置`resp`为true后`[BizData, RawData, RawResponse]`。 * 中间件返回的数据会直接到`then`方法中,如果不处理业务数据可直接返回next的执行结果。 */ (options: RequestConfig, next: NextMiddleware): IAbortablePromise; } /** * 错误码对象. * * @see https://opendocs.alipay.com/mini/api/owycmh#%E9%94%99%E8%AF%AF%E7%A0%81 */ interface ErrorCodeMap { 1: '请求没有结束,就跳转到了另一个页面。'; 2: '参数错误。'; 9: '取消请求。'; 11: '无权调用该接口。'; 12: '网络出错。'; 13: '超时。'; 14: '解码失败。'; 15: '传参失败。'; 19: 'HTTP 错误。'; 20: '请求已被停止/服务端限流。'; 23: '代理请求失败。'; } /** * 网络请求错误对象. * * @see https://opendocs.alipay.com/mini/api/owycmh#%E9%94%99%E8%AF%AF%E7%A0%81 */ interface HttpError extends IError { } /** * 可以取消操作的Promise,如果有实际取消操作代理到实际取消,否则按照默认取消操作reject错误(如小程序取消请求错误)模拟取消。 * 按照ts lib.es5.d.ts内置Promise定义扩展abort方法, 修改then、catch、finally返回IAbortablePromise。 */ interface IAbortablePromise extends Promise { then: (onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: Any) => TResult2 | PromiseLike) | undefined | null) => IAbortablePromise; catch: (onrejected?: ((reason: Any) => TResult | PromiseLike) | undefined | null) => IAbortablePromise; finally: (onfinally?: (() => void) | undefined | null) => IAbortablePromise; /** * 取消请求,根据实际情况可能先模拟取消请求,再代理到实际取消请求,取消请求会reject错误,使用http `isCanceled`方法可以判断是否为取消请求错误。 */ abort?: () => void; } /** * http请求返回`RequestTask`,可以调用`abort`方法取消请求。 * * @template T Type of 业务数据. * @see https://opendocs.alipay.com/mini/api/owycmh#%E8%BF%94%E5%9B%9E%E5%80%BC%20RequestTask */ interface IRequestTask extends IAbortablePromise { } export type { Method, DataType, Headers, RequestConfig, RawResponse, ResponseTemplate, ErrorCodeMap, HttpError, IAbortablePromise, IRequestTask, RequestInterceptor, ResponseInterceptor, DefaultResponseInterceptor, TransformRequest, Middleware, NextMiddleware, DefaultMiddleware };