API модуль
API (REST)
Создает сервисный transport client agnostic слой-обертку для REST обращений к бэкенду по HTTP(S).
В качестве HTTP транспортного клиента может использоваться fetch
, axios
или промисная версия XHR
, на выбор разработчика. С помощью неё вызовы API в коде выглядят следующим образом:
import { api } from "@/services/api";
const apiData = ref();
apiData.value = await api.utils.testRest();
Каждый вызов представляет из себя асинхронную функцию, возвращающую Promise
.
// utils.ts
import http from "./http";
const utils = {
async testRest() {
return http.get("https://jsonplaceholder.typicode.com/todos/1");
}
}
Так же реализована система перехватчиков (interceptors
).
Абстракция обращения к бэкенду позволяет в дальнейшем при желании легко перейти на другой транспорт (JSON-RPC, WebSockets, gRPC, GraphQL) - без изменения кода в части бизнес-логики приложения.
JSON-RPC
Устанавливает JSON-RPC адаптер для связи с бэкендом. Вызовы к бэкенд API в прикладном коде остаются такими же, но вместо REST запросов используется JSON-RPC
// utils.ts
import { jsonRpc } from "./jsonrpc";
const utils = {
async testJsonRpc() {
return jsonRpc({
method: "getBestBlockHash",
params: {},
}, { uri: "https://seed-1.testnet.networks.dash.org:1443/" });
},
}
JSON-RPC адаптер максимально полно реализует спецификацию JSON-RPC 2.0
Инициализация API модуля:
// api/index.ts
import utils from "./utils";
import { notificationInterceptor } from "./interceptors";
import jsonrpc from "./jsonrpc";
import http from "./http";
const api = {
utils,
http,
init() {
http.setOptions({
baseUrl: import.meta.env.VITE_API_URL,
headers: { "Content-Type": "application/json" },
});
jsonrpc.addResponseInterceptor(notificationInterceptor);
},
};
export { api };
export default api;
Совет
JSON-RPC протокол очень удобен и является де-факто стандартом для web 3.0. Рекомендуется для использования вместо REST