retrofit-cjs 是一个基于JavaScript装饰器(Decorator)和 axios 实现的网络请求库, 支持Vue / React / react-native 等常用框架
retrofit-cjs 是一个基于JavaScript装饰器(Decorator)和 axios 实现的网络请求库, 支持Vue / React / react-native 等常用框架
![]()
![]()
1. 安装
npm i retrofit-cjs --save
Babel 转码器的支持
安装 babel-plugin-transform-decorators-legacy
npm i babel-plugin-transform-decorators-legacy -D
配置 .babelrc 文件
"plugins": ["transform-decorators-legacy"]
如果是使用 create-react-app 创建的项目,需要先弹出 webpack 配置
npm run eject
安装 babel-plugin-transform-decorators-legacy,在 package.json 中配置 babel
"babel": {
"presets": [
"react-app"
],
"plugins": [
"transform-decorators-legacy"
]
}
vue-cli3 已默认支持 Decorator
2. 引入 retrofit-cjs
import { GET, POST, Headers } from 'retrofit-cjs';
@POST({url: '/user', data: {id: 1, name: 'glang'}})
注意配置顺序,修饰器会从内向外执行
一些工具修饰器
注意:在同一个方法上,@Debounce,@Throttle,@Timer,@Interval 和 @GET,@POST,@PUT,@DELETE,@HTTP是无法同时使用的
3. 使用
推荐
```js
@AddResInterceptor((res)=>{
// response result
return res;
}, (error)=>{
// response error
})
@Config({timeout: 2000})
@Headers({‘User-Agent’: ‘request’})
@Create({
baseURL: ‘https://cnodejs.org/api‘,
timeout: 1000,
headers: {
'X-Custom-Header': 'foobar'
}
})
class TopicApi{
static getInstance(){
return new TopicApi();
}
@Cancel((cancel) => {
// cancel(); //取消当前请求
})
@Config({timeout: 1000})
@Headers({‘User-Agent’: ‘request’})
@GET(‘/v1/topics’)
// @GET(‘/v1/{0}’, ‘topics’)
// @GET(‘https://cnodejs.org/api/v1/topics‘)
// @GET({url: ‘/v1/topics’, params: {limit: 10}})
getTopicList(res){
// 处理结果
return res;
}
@Debounce(2000)
// @HTTP({
// url: ‘/v1/topic/5433d5e4e737cbe96dcef312’,
// method: ‘get’,
// params: {}
// })
@GET(‘/v1/topic/{topicId}’)
getTopicDetails(res){
// response result
}
// 以表单方式提交数据
@FormUrlEncoded
@POST(‘/user’)
// @POST({url: ‘/user’, data: {id: 1, name: ‘glang’}})
addUser(res) {
}
}
let topicApi = TopicApi.getInstance();
// topicApi.getTopicDetails(‘topicId=5433d5e4e737cbe96dcef312’, {
// limit: 20
// });
// 参数会按 {} 自动匹配
topicApi.getTopicDetails({
topicId: ‘5433d5e4e737cbe96dcef312’,
limit: 20
});
topicApi.addUser({id: 1, name: ‘glang’});
2. react / react-native
```js
import {Interval} from 'retrofit-cjs';
@Create({
baseURL: 'https://cnodejs.org/api'
})
class App extends Component{
constructor(props) {
super(props);
// this.countdwon = this.countdwon.bind(this);
}
@GET('/v1/topics')
getTopicList(res){
// 处理结果
}
@Interval(1000, 60 * 1000)
countdwon(){
}
}
使用Vue插件配置请求基本信息
```js
// Vue 入口文件
import Vue from ‘vue’
import {RetroPlugin} from ‘retrofit-cjs’;
Vue.use(RetroPlugin, {
baseURL: ‘https://cnodejs.org/api‘,
timeout: 1000,
headers: {
‘X-Custom-Header’: ‘foobar’
}
});
### @AddReqInterceptor
> 通过请求拦截器处理请求参数
```js
@AddReqInterceptor((request)=>{
request.transformRequest = [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}]
return request;
})
class TopicApi{
...
}
欢迎大佬们吐槽。