http
默认请求实例
http 是 Oiyo 数据获取模块提供的默认请求实例,无前置配置,可直接发起请求。
oiyo 已将该 http 默认导入,无需再 import 即可直接使用。
http.create()
基于当前实例派生新实例,与 createHttp 派生出的实例共用同一套方法
声明
http.create(config: HttpConfig): Http
参数
config 的属性以及类型继承于 HttpCommonOptions:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
onBeforeRequest | function | - | 发出请求前的钩子 |
onRequestError | function | - | 没有收到响应时的钩子 |
onResponseSuccess | function | - | 响应通过状态校验时的钩子 |
onResponseError | function | - | 响应未通过状态校验时的钩子 |
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
baseURL | string | - | 基础地址,资源为绝对地址时忽略 |
method | 'GET' | 'POST' | ... | 随方法而定 | 请求方法 |
headers | Record<string, string> | - | 请求头,多层配置浅合并 |
query | Record<string, any> | - | 查询参数,会序列化拼接到 URL,支持数组 |
body | any | - | 请求体(upload 时对应 formData) |
timeout | number | 60000 | 超时时间(毫秒) |
raw | boolean | false | 为 true 返回完整响应对象,否则只返回精炼后的 data |
responseType | 'json' | 'text' | 'arrayBuffer' | 'json' | 响应体类型(手动解析) |
parseResponse | (text: string) => any | - | 自定义 JSON 解析函数 |
retry | number | false | 随方法而定 | 最大重试次数,false 不重试 |
retryDelay | number | 0 | 重试间隔(毫秒) |
retryStatusCodes | number[] | [408, 409, 425, 429, 500, 502, 503, 504] | 参与重试的状态码 |
validateStatus | (status: number) => boolean | status >= 200 && status < 300 | 通过 onResponseSuccess,未通过则 onResponseError 并 reject |
signal | HttpAbortSignal | - | 中断信号,由 createHttpAborter() 创建 |
onHeaders | (data, off) => void | - | 监听响应头 |
钩子
config.onBeforeRequest()
触发时机:发出请求前
- 声明
interface HttpConfig { onBeforeRequest(context: { url: HttpURL, options: HttpOptions }): MaybePromise<HttpOptions | void> } - 示例
const api = createHttp({ onBeforeRequest({ url, options }) { console.log('发起请求', url, options) }, })
config.onRequestError()
触发时机:没有 HTTP 响应 —— 传输失败(网络错误、超时、跨域等)通过 HttpError 抛出;若错误来自 onBeforeRequest 自身抛出的异常(或已中断信号),则原样透传
- 声明
interface HttpConfig { onRequestError(context: { url: HttpURL, options: HttpOptions, error: Error }): MaybePromise<unknown> } - 示例
const api = createHttp({ onRequestError({ error }) { console.error('请求失败', error) }, })
config.onResponseSuccess()
触发时机:有响应且 validateStatus 通过(默认 2xx)
- 声明
interface HttpConfig { onResponseSuccess(context: { url: HttpURL, options: HttpOptions, response: HttpRawResponse }): MaybePromise<HttpRawResponse | void> } - 示例
const api = createHttp({ onResponseSuccess({ response }) { console.log('收到响应', response.statusCode) }, })
config.onResponseError()
触发时机:有响应但 validateStatus 未通过(会 reject HttpError.STATUS)
- 声明
interface HttpConfig { onResponseError(context: { url: HttpURL, options: HttpOptions, response: HttpRawResponse, error: HttpError }): MaybePromise<unknown> } - 示例
const api = createHttp({ onResponseError({ response, error }) { console.error('响应错误', response.statusCode, error) }, })
onResponseSuccess与onResponseError互斥。- 钩子可声明在任意一层配置(实例、派生实例、单次请求)上。多层配置的同名钩子会在配置合并阶段串联为一个函数,按层级顺序依次
await执行。 - 若希望 4xx 不当错误抛出,请放宽
validateStatus(例如() => true)。
http.request()
普通请求方法
声明
http.request<TRBody = any>(url: HttpURL, options?: HttpRequestOptions): Promise<TRBody>
参数
options 的属性以及类型继承于 HttpCommonOptions:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
method | 'GET' | 'POST' | ... | 'GET' | 请求方法 |
onChunk | (event, off) => void | - | 监听流式数据,回调额外提供 off() 用于关闭流式数据监听 |
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
baseURL | string | - | 基础地址,资源为绝对地址时忽略 |
method | 'GET' | 'POST' | ... | 随方法而定 | 请求方法 |
headers | Record<string, string> | - | 请求头,多层配置浅合并 |
query | Record<string, any> | - | 查询参数,会序列化拼接到 URL,支持数组 |
body | any | - | 请求体(upload 时对应 formData) |
timeout | number | 60000 | 超时时间(毫秒) |
raw | boolean | false | 为 true 返回完整响应对象,否则只返回精炼后的 data |
responseType | 'json' | 'text' | 'arrayBuffer' | 'json' | 响应体类型(手动解析) |
parseResponse | (text: string) => any | - | 自定义 JSON 解析函数 |
retry | number | false | 随方法而定 | 最大重试次数,false 不重试 |
retryDelay | number | 0 | 重试间隔(毫秒) |
retryStatusCodes | number[] | [408, 409, 425, 429, 500, 502, 503, 504] | 参与重试的状态码 |
validateStatus | (status: number) => boolean | status >= 200 && status < 300 | 判定是否走成功路径;未通过则 onResponseError 并 reject |
signal | HttpAbortSignal | - | 中断信号,由 createHttpAborter() 创建 |
onHeaders | (data, off) => void | - | 监听响应头 |
回调
options.onChunk()
触发时机:每当收到一段流式数据(对应原生 task.onChunkReceived)
- 声明
interface HttpRequestOptions { onChunk(event: { data: ArrayBuffer }, off: () => void): void } - 示例
await http.request('/chat/stream', { onChunk(event, off) { console.log('收到流式分片', event.data) // 不再需要监听时调用,关闭流式数据监听 off() }, })
http.upload()
文件上传,底层走 uni.uploadFile
声明
http.upload<TRBody = any>(url: HttpURL, options?: HttpUploadOptions): Promise<TRBody>
参数
options 的属性以及类型继承于 HttpCommonOptions:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 'file' | 文件对应的字段名 |
method | 'POST' | 'POST' | 请求方法(强制 POST) |
onProgress | (data, off) => void | - | 上传进度监听,回调额外提供 off() 用于 offProgressUpdate |
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
baseURL | string | - | 基础地址,资源为绝对地址时忽略 |
method | 'GET' | 'POST' | ... | 随方法而定 | 请求方法 |
headers | Record<string, string> | - | 请求头,多层配置浅合并 |
query | Record<string, any> | - | 查询参数,会序列化拼接到 URL,支持数组 |
body | any | - | 请求体(upload 时对应 formData) |
timeout | number | 60000 | 超时时间(毫秒) |
raw | boolean | false | 为 true 返回完整响应对象,否则只返回精炼后的 data |
responseType | 'json' | 'text' | 'arrayBuffer' | 'json' | 响应体类型(手动解析) |
parseResponse | (text: string) => any | - | 自定义 JSON 解析函数 |
retry | number | false | 随方法而定 | 最大重试次数,false 不重试 |
retryDelay | number | 0 | 重试间隔(毫秒) |
retryStatusCodes | number[] | [408, 409, 425, 429, 500, 502, 503, 504] | 参与重试的状态码 |
validateStatus | (status: number) => boolean | status >= 200 && status < 300 | 判定是否走成功路径;未通过则 onResponseError 并 reject |
signal | HttpAbortSignal | - | 中断信号,由 createHttpAborter() 创建 |
onHeaders | (data, off) => void | - | 监听响应头 |
回调
options.onProgress()
触发时机:上传进度变化时(对应原生 task.onProgressUpdate)
- 声明
interface HttpUploadOptions { onProgress(data: UniAppUploadOnProgressData, off: () => void): void } interface UniAppUploadOnProgressData { /** 上传进度百分比 */ progress: number /** 已经上传的数据长度,单位 Bytes */ totalBytesSent: number /** 预期需要上传的数据总长度,单位 Bytes */ totalBytesExpectedToSend: number } - 示例
await http.upload('/upload', { filePath, onProgress(data, off) { console.log(`上传进度 ${data.progress}%`) // 满足条件后可调用 off() 关闭上传进度监听 if (data.progress >= 90) { off() } }, })
http.download()
文件下载
声明
http.download<TRBody = any>(url: HttpURL, options?: HttpDownloadOptions): Promise<TRBody>
参数
options 的属性以及类型继承于 HttpCommonOptions:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
method | 'GET' | 'GET' | 请求方法(强制 GET) |
onProgress | (data, off) => void | - | 下载进度监听,回调额外提供 off() 用于 offProgressUpdate |
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
baseURL | string | - | 基础地址,资源为绝对地址时忽略 |
method | 'GET' | 'POST' | ... | 随方法而定 | 请求方法 |
headers | Record<string, string> | - | 请求头,多层配置浅合并 |
query | Record<string, any> | - | 查询参数,会序列化拼接到 URL,支持数组 |
body | any | - | 请求体(upload 时对应 formData) |
timeout | number | 60000 | 超时时间(毫秒) |
raw | boolean | false | 为 true 返回完整响应对象,否则只返回精炼后的 data |
responseType | 'json' | 'text' | 'arrayBuffer' | 'json' | 响应体类型(手动解析) |
parseResponse | (text: string) => any | - | 自定义 JSON 解析函数 |
retry | number | false | 随方法而定 | 最大重试次数,false 不重试 |
retryDelay | number | 0 | 重试间隔(毫秒) |
retryStatusCodes | number[] | [408, 409, 425, 429, 500, 502, 503, 504] | 参与重试的状态码 |
validateStatus | (status: number) => boolean | status >= 200 && status < 300 | 判定是否走成功路径;未通过则 onResponseError 并 reject |
signal | HttpAbortSignal | - | 中断信号,由 createHttpAborter() 创建 |
onHeaders | (data, off) => void | - | 监听响应头 |
回调
options.onProgress()
触发时机:下载进度变化时(对应原生 task.onProgressUpdate)
- 声明
interface HttpDownloadOptions { onProgress(data: UniAppDownloadOnProgressData, off: () => void): void } interface UniAppDownloadOnProgressData { /** 下载进度百分比 */ progress: number /** 已经下载的数据长度,单位 Bytes */ totalBytesWritten: number /** 预期需要下载的数据总长度,单位 Bytes */ totalBytesExpectedToWrite: number } - 示例
const { tempFilePath } = await http.download('/file/report.pdf', { onProgress(data, off) { console.log(`下载进度 ${data.progress}%`) // 满足条件后可调用 off() 关闭下载进度监听 if (data.progress >= 50) { off() } }, })
行为
- 无
baseURL,资源必须传绝对地址,相对地址会因缺省基础地址而报错。 - 无预置钩子与公共
headers,每次请求只走单次配置。 - 与
createHttp派生出的实例共用同一套配置项、钩子、重试与中断能力。