106 lines
2.7 KiB
Markdown
106 lines
2.7 KiB
Markdown
# MApi Client
|
||
|
||
这是一个适用于 MServer v3 的 JS SDK,封装了常用接口请求方法以及返回类型的声明,以快速开发前端应用。
|
||
|
||
## 迁移到 v1
|
||
|
||
不再提供 camelcase-keys 的 re-export,此库不再依赖 camelcase-keys 库,如有需要可自行安装。
|
||
|
||
```diff
|
||
- import { camelcaseKeysDeep, camelcaseKeys } from '@mx-space/api-client'
|
||
+ import { simpleCamelcaseKeys as camelcaseKeysDeep } from '@mx-space/api-client'
|
||
```
|
||
|
||
## 如何使用
|
||
|
||
此 SDK 框架无关,不捆绑任何一个网络请求库,只需要提供适配器。你需要手动传入符合接口标准的适配器。
|
||
|
||
此项目提供 `axios` 和 `umi-request` 两个适配器。
|
||
|
||
以 `axios` 为例。
|
||
|
||
```ts
|
||
import {
|
||
AggregateController,
|
||
CategoryController,
|
||
NoteController,
|
||
PostController,
|
||
allControllers, // ...
|
||
createClient,
|
||
} from '@mx-space/api-client'
|
||
import { axiosAdaptor } from '@mx-space/api-client/adaptors/axios'
|
||
|
||
const endpoint = 'https://api.innei.dev/v2'
|
||
const client = createClient(axiosAdaptor)(endpoint)
|
||
|
||
// `default` is AxiosInstance
|
||
// you can do anything else on this
|
||
// interceptor or re-configure
|
||
const $axios = axiosAdaptor.default
|
||
// re-config (optional)
|
||
$axios.defaults.timeout = 10000
|
||
// set interceptors (optional)
|
||
$axios.interceptors.request.use(
|
||
(config) => {
|
||
const token = getToken()
|
||
if (token) {
|
||
config.headers!['Authorization'] = 'bearer ' + getToken()
|
||
}
|
||
|
||
return config
|
||
},
|
||
(error) => {
|
||
if (__DEV__) {
|
||
console.log(error.message)
|
||
}
|
||
|
||
return Promise.reject(error)
|
||
},
|
||
)
|
||
|
||
// inject controller first.
|
||
client.injectControllers([
|
||
PostController,
|
||
NoteController,
|
||
AggregateController,
|
||
CategoryController,
|
||
])
|
||
|
||
// or you can inject allControllers
|
||
client.injectControllers(allControllers)
|
||
|
||
// then you can request `post` `note` and `aggregate` controller
|
||
|
||
client.post.post.getList(page, 10, { year }).then((data) => {
|
||
// do anything
|
||
})
|
||
```
|
||
|
||
**为什么要手动注入控制器**
|
||
|
||
按需加载,可以减少打包体积 (Tree Shake)
|
||
|
||
**为什么不依赖请求库**
|
||
|
||
可以防止项目中出现两个请求库,减少打包体积
|
||
|
||
**如果不使用 axios,应该如何编写适配器**
|
||
|
||
参考 `src/adaptors/axios.ts` 和 `src/adaptors/umi-request.ts`
|
||
|
||
**如何使用 proxy 来访问 sdk 内未包含的请求**
|
||
|
||
如请求 `GET /notes/something/other/123456/info`,可以使用
|
||
|
||
```ts
|
||
client.note.proxy.something.other('123456').info.get()
|
||
```
|
||
|
||
**从 proxy 获取请求地址但不发出**
|
||
|
||
```ts
|
||
client.note.proxy.something.other('123456').info.toString() // /notes/something/other/123456/info
|
||
|
||
client.note.proxy.something.other('123456').info.toString(true) // http://localhost:2333/notes/something/other/123456/info
|
||
```
|