retrofit-cjsЭто библиотека сетевых запросов, основанная на JavaScript Decorator (Декораторе) и axios, поддерживает распространенные фреймворки, такие как Vue/React/act-native, и поддерживает node.js.
инструкции
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-реагировать, вам нужно сначала открыть конфигурацию веб-пакета.
npm run eject
Установите babel-plugin-transform-decorators-legacy, настройте babel в package.json
"babel": {
"presets": [
"react-app"
],
"plugins": [
"transform-decorators-legacy"
]
}
vue-cli3 уже поддерживает Decorator по умолчанию
2. Ввести ретрофит-cjs
import { GET, POST, Headers } from 'retrofit-cjs';
декоратор
декоратор метода свойств
@GET('/v1/topics')
@GET('/v1/{0}', 'topics')
@GET('https://cnodejs.org/api/v1/topics')
@GET({url: '/v1/topics', params: {limit: 10}})
@GET('/v1/topic/{topicId}')
@POST({url: '/user', data: {id: 1, name: 'glang'}})
- @PUT
- @DELETE
- @HTTP
-
@Config
- Установить информацию о запросе, работает только с текущим запросом
- Посмотреть конфигурацию запроса
-
@Headers
- Установите заголовок запроса, который работает только с текущим запросом
- @Cancel
- @Multipart
-
@FormUrlEncoded
- Отправьте данные в форму, по умолчанию отправьте в json
- Совместимость с решениями адаптивной обработки
- Обработка через перехватчик запросов
декоратор класса
-
@Create
- Создайте новый экземпляр запроса, и другие последующие операции зависят от созданного экземпляра.По умолчанию используется глобальный экземпляр запроса. Базовую информацию запроса можно настроить, а базовую настройку информации также можно выполнить через @Config и @Headers.
-
@Config
- Настройте глобальную информацию запроса,Если используется @Create, он работает с текущим объектом запроса, в противном случае он работает с глобальным объектом.
-
@Headers
- Настройте информацию заголовка глобального запроса,Если используется @Create, он работает с текущим объектом запроса, в противном случае он работает с глобальным объектом.
- @AddReqInterceptorДобавить перехватчик запросов
-
@AddResInterceptorДобавить перехватчик ответа
Обратите внимание на порядок конфигурации, декоратор будет выполняться изнутри наружу
некоторые модификаторы инструментов
- @DebounceСтабилизатор
@Debounce(1000) // 1秒防抖
@Debounce(1000, true) // 1秒防抖, 立即执行
- @Throttleдросселирование
@Throttle(1000, {leading: false}) // 忽略开始函数的的调用
@Throttle(1000, {trailing: false}) // 忽略结尾函数的调用
// 两者不能共存, 否则函数不能执行
- @Timerоперация синхронизации
@Timer(1000) // 延迟1秒执行
@Timer(1000, true) // 延迟1秒执行, 立即执行修饰函数
- @Intervalоперация синхронизации
@Interval(1000) // 每隔1秒执行一次
@Interval(1000, true) // 每隔1秒执行一次, 立即执行修饰函数
@Interval(1000, 10000) // 每隔1秒执行一次, 10秒后结束
@Interval(1000, 10000, true) // 每隔1秒执行一次, 10秒后结束,立即执行修饰函数
- @RetroPluginПлагин Vue: глобальная настройка сетевых запросов
Примечание. @Debounce, @Throttle, @Timer, @Interval и @GET, @POST, @PUT, @DELETE, @HTTP нельзя использовать одновременно в одном и том же методе.
3. Используйте
- рекомендовать
@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'});
- react / react-native
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
export default {
name: "app",
mounted() {
this.getList();
},
methods: {
// @Config 只影响当前网络请求
@Config({
baseURL: 'https://cnodejs.org/api',
timeout: 1000
})
@GET("/v1/topics")
getList(res, err) {
//
}
}
}
@RetroPlugin
Настроить основы запроса с Vue Plugin
// 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
Обработка параметров запроса через перехватчики запросов
@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{
...
}