微前端nuxt3.0方便请求api可封装一个使用哈希算法出key值的http,http封装

news/2025/1/11 17:48:25/

http.ts

import { hash } from 'ohash'

import type { FetchOptions } from 'ohmyfetch'

interface httpOptions {

  source?: string

}

/**** 获取接口前缀 */

我这里为不同站点的接口做了区分,主站点为api,demo站点为demoapi

function GetPrefixUrl(source?: string) {

const {public : config} = useRuntimeConfig();

  // 默认正式接口

  let API_BASE = {

    api: config.VITE_API,

    demoapi: config.VITE_DEMO_API,

  };

  let prefixUrl = '';

  switch (source) {

    case 'demo':

      prefixUrl = API_BASE.demoapi;

      break;

    default:

      prefixUrl = API_BASE.api;

      break;

  }

//不是微前端的可以忽略这个例子

  if (source === 'demoapi') {

    const prefixcode = process.client ? 'demoapi' : 'api'; //判断接口是服务端还是客户端请求

    return prefixUrl + prefixcode;

  } else {

    const prefixcode = process.client ? 'asyncapi' : 'api'; //判断接口是服务端还是客户端请求

    return prefixUrl + prefixcode;

  }

不是微前端的直接写:

const prefixcode = process.client ? 'asyncapi' : 'api'; 

return prefixUrl + prefixcode;

}

/** http 请求封装 */

export async function httpHandler<T, U extends httpOptions>(url: string, method: string, params: T | null, options: Partial<U> = {}) {

  const config: FetchOptions = {};

  const httpOptions = options;

  let prefixUrl = GetPrefixUrl(httpOptions.source);

  config.method = method;

  config.headers = useRequestHeaders(['user-agent','x-forwarded-for','x-real-ip','accept-encoding','accept-language']);// 加了x-real-ip的作用是获取用户真实ip,根据自己需求是否要获取用户真实ip来保留日志记录

  config.baseURL = prefixUrl;

  const token = useCookie('token').value

  if(token) {

    config.headers.Authorization = `${token}`

  }

  if(config.headers['x-forwarded-for'] == undefined && config.headers['x-real-ip'] != undefined){config.headers['x-forwarded-for'] = config.headers['x-real-ip']};

  if (params != null) {

    if (method === 'get') {

      config.params = params;

    } else {

      config.body = params;

    }

  }

  let rst: any = {};

  const key = hash(JSON.stringify(options) + url) // 使用hash算法获取不同的key值;当客户端传的参数不同时key值才会改变

  const response = await useAsyncData(key, () =>

    $fetch(url, config).catch((error) => {     

// 当token失效跳转登录页登录

      if(error.data.Code === 401) {        

        const redirect = route.path;

        window.location.href = `/login?redirect=${redirect}`;

      }

    })

  );

  rst = <any>response.data.value;

  switch (rst.Code) {

    case 0:  

      if(rst.Data)

      return rst.Data;

      break;

    case 401:

    case 403:

      // token 失效

      console.error(rst.Message);

      throw(rst.Message);

    default:

      console.error(rst.Message);

      throw(rst.Message);

  }

}

// type Partial<U> = {}

export async function httpGet<T, U>(url: string, options: Partial<U> = {}) {

  const rst = await httpHandler<T, U>(url, 'get', null, options);

  return rst;

}

export async function httpPost<T, U>(url: string, params?: T, options?: U) {  

  const rst = await httpHandler<T, U>(url, 'post', params, options);

  return rst;

}

api/api.ts api文件夹下的api.ts

import { httpPost, httpGet } from '~/utils/http';

// p是参数

export const 组件使用名= (p: any) => httpPost('接口名', p);

// demo是不同站点的来源;不是微前端的可以忽略这个例子

export const 组件使用名= (p: any) => httpPost('接口名', p, demo);

demo.vue

import { 组件使用名,组件使用名1,组件使用名2 } from '~/api/api;

const data = await 组件使用名(); // 服务端请求

const [data1, data2] = await Promise.all([组件使用名1(),组件使用名2()]) // 多个接口请求

//客户端请求

const data  = ()=> {

组件使用名().then(()=>{})

}


http://www.ppmy.cn/news/80606.html

相关文章

IMX6ULL裸机篇之DDR3参数配置分析

一. DDR3L 初始化简介 上一篇博文进行了 DDR参数的初始化&#xff0c;通过一个 execl表进行配置&#xff0c;生成脚本文件。文章网址如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 "Register Configur…

记一次docker中的oracle连接问题

起因是客户登陆时报错TNS-12537 登陆上上服务器后&#xff0c;发现了几个特点。 1、没有oracle用户 2、数据文件的位置和spfile里面写的不一样 3、pmon进程存在&#xff0c;但是父进程ID不是1 4、配置oracle用户及环境变量&#xff0c;但是as sysdba无法登录到数据库 查看…

测试岗位是巨坑,7年测试告诉你千万别入行.....

每次都有人问我软件测试的前景是什么样的&#xff0c;每年也会有人很多人纷纷涌入测试的岗位上&#xff0c;希望自己能够进入阿里、华为等大厂 但是测试岗位真的那么吃香吗&#xff1f;今天我结合从零基础小白到测试开发的成长经历&#xff0c;来说下这个行业的发展前景&#…

【算法】Convert to Base -2 负二进制转换

文章目录 Convert to Base -2 负二进制转换问题描述&#xff1a;分析代码 Convert to Base -2 负二进制转换 问题描述&#xff1a; 给你一个整数 n &#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。 注意&#xff0c;除非字符串…

应用交付流程安全规范

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130793290 一、平台安全使用规范 平台安全使用规范主要是规定平台层&#xff08;包括主机、Kubernetes集群&#xff09;的用户和文件权限及Kubernetes平台配置和使用规则。 如下所示&#xff1a; 类…

图像滤波概述

什么是图像滤波 1.图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 2.消除图像中的噪声成分叫作图像的平滑化或滤波操…

C++中string的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有&#xff1a;Blink、WebKit、Gecko、Trident 等&#xff0c;目前 WebKit 内核占据了非常大的的市场&#xff0c;包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器&#xff0c;都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…