数据请求
大多数前端应用都需要通过 HTTP 协议与后端服务器通讯。在 icejs 框架中内置约定和规范了一套从 UI 交互到请求服务端数据的完整方案,更进一步简化了应用的数据请求流程,基于此提供了 request 和 useRequest Hooks 方法。
#
目录约定目录组织如下:
#
定义 service通过调用 request 定义数据请求如下:
#
消费 service消费 service 主要有两种方式:
- 在模型中调用 service:
service
->model
->view
- 在视图中调用 service:
service
->view
#
在模型中调用 service结合 状态管理文档 使用
service
:约定数据请求统一管理在 services 目录下;model
:约定数据请求统一在 models 里进行调用;view
:最终在视图里通过调用 models 的 effects 的方法触发数据请求。
在模型中调用定义好的 service:
- 在视图中调用模型方法:
#
在视图中调用 serviceservice
:约定数据请求统一管理在 services 目录下;view
:最终在视图里通过 useRequest 直接调用 service 触发数据请求。
#
API#
requestrequest 基于 axios 进行封装,在使用上整体与 axios 保持一致,差异点:
- 默认只返回服务端响应的数据
Response.data
,而不是整个 Response,如需返回整个 Response 请通过withFullResponse
参数开启 - 在 axios 基础上默认支持了多请求示例的能力
使用方式如下:
常用使用方式:
RequestConfig:
更完整的配置请 参考。
返回完整 Response Schema 如下:
#
useRequest使用 useRequest 可以极大的简化对请求状态的管理,useRequest 基于 ahooks/useRequest 封装,差异点:
- 将
requestMethod
参数默认设置为上述的request
(即 axios),保证框架使用的一致性 - manual 参数默认值从
false
改为true
,因为实际业务更多都是要手动触发的 - 返回值
run
改为request
,因为更符合语义
#
API#
常用使用方式更多使用方式详见 ahooks/useRequest
#
请求配置在实际项目中通常需要对请求进行全局统一的封装,例如配置请求的 baseURL、统一 header、拦截请求和响应等等,这时只需要在应用的的 appConfig 中进行配置即可。
#
多个请求配置在某些复杂场景的应用中,我们也可以配置多个请求,每个配置请求都是单一的实例对象。
使用示例:
#
异常处理无论是拦截器里的错误参数,还是 request/useRequest 返回的错误对象,都符合以下类型:
#
高阶用法#
Mock 接口项目开发初期,后端接口可能还没开发好或不够稳定,此时前端可以通过 Mock 的方式来模拟接口,参考文档 本地 Mock 能力。
#
使用真实的后端接口调试前端代码当项目开发到一定时间段时,我们需要联调后端接口,此时可能会遇到各种跨域问题,参考文档 本地 Proxy 能力。
#
如何解决接口跨域问题当访问页面地址和请求接口地址的域名或端口不一致时,就会因为浏览器的同源策略导致跨域问题,此时推荐后端接口通过 CORS 支持信任域名的跨域访问,具体请参考:
#
根据环境配置不同的 baseURL大部分情况下,前端代码里用到的后端接口写的都是相对路径如 /api/getFoo.json
,然后访问不同环境时浏览器会根据当前域名发起对应的请求。如果域名跟实际请求的接口地址不一致,则需要通过 request.baseURL
来配置:
结合环境配置即可实现不同环境使用不同的 baseURL:
在 src/app.ts
中配置 request.baseURL
:
#
版本升级#
内置的 axios 从 0.19.x 升级到 0.21.xicejs 2.0 中升级