原生js封装请求组件

news/2024/7/24 10:18:17 标签: javascript, 开发语言, ecmascript

1、建立两个js文件

  1. 调用接口列表 api.js
  2. 调用请求方法 http.js

http.js内容

javascript">let origin = 'http://cms.11lou.cn/index.php/api/' // 后端接口域名
 
/**
 * 发起HTTP请求的API封装函数
 * @param {string} type 请求类型,如GET、POST等
 * @param {string} _url 请求的URL路径
 * @param {Object} params 请求的参数,默认为空对象
 * @param {Object} headers 请求头的参数,默认为空对象
 * @returns 返回httpRequest函数处理后的结果
 */
 function httpApi(type, url, params = {},headers = {}) {
    
        // 构造请求配置对象
        let object = {
            method: type || 'GET',  // 默认请求方法为GET
            url: origin+url,     // 通过address对象获取完整的请求URL
            data: params,		// 设置请求参数
            headers:headers
        }
     // 发起HTTP请求
        return httpRequest(object);

         
} 
/**
 * 发起 HTTP 请求的函数
 * @param {Object} obj - 配置对象,包含请求的参数,如 method, url, data, dataType, headers
 * @returns {Promise} 返回一个 Promise 对象,可以通过 then/catch 来处理请求的成功与失败
 */
function httpRequest(obj) {
  return new Promise((resolve, reject) => {
    // 创建 XMLHttpRequest 对象
    const xmlHttp = createXMLHttpRequest();
    if (!xmlHttp) {
      alert("浏览器不支持 xmlHttp");
      return;
    }

    const httpMethod = (obj.method || "Get").toUpperCase();
    const httpDataType = obj.dataType || 'json';
    const httpUrl = encodeURI(obj.url); // 对 URL 进行编码
    const async = true;
    const headers = obj.headers || {};

    let requestData;
    if (httpMethod === "POST") {
      requestData = buildRequestData(obj.data);
    }

    // 发起 GET 或 POST 请求
    xmlHttp.open(httpMethod, httpUrl, async);
    if (httpMethod === "POST") {
      xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }

    // 设置自定义请求头
    for (const [headerName, headerValue] of Object.entries(headers)) {
      xmlHttp.setRequestHeader(headerName, headerValue);
    }

    xmlHttp.send(requestData);

    // 处理请求状态变化
    xmlHttp.onreadystatechange = function () {
      if (xmlHttp.readyState === 4) {
        if (xmlHttp.status === 200) {
          handleResponseData(xmlHttp.responseText, resolve, reject, httpDataType);
        } else {
          reject(new Error(`请求失败,状态码: ${xmlHttp.status}`));
        }
      }
    };
  });
}

// ... 其他辅助函数保持不变 ...

// 封装创建 XMLHttpRequest 对象的函数
function createXMLHttpRequest() {
  if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
  return null;
}

// 构建查询字符串
function buildRequestData(data) {
  if (!data) return "";
  return new URLSearchParams(data).toString();
}

// 根据不同的数据类型处理响应数据
function handleResponseData(responseText, resolve, reject, dataType) {
  try {
    if (dataType === 'json') {
      let res = JSON.parse(responseText);
      if (res && res.code === 1) {
        resolve(res);
      } else {
        reject(res);
      }
    } else if (dataType === 'text') {
      resolve(responseText);
    }
  } catch (error) {
    reject(error);
  }
}

api.js内容

javascript">
	const address = {
	    info:  'cms.Index/index', // 后端接口
	}

2、调用方式

<!-- 调用接口列表 -->
<script src="./js/http/api.js"></script> 
<!-- 调用请求方法 -->
<script src="./js/http/jmhttp.js"></script> 
<script>javascript">
    httpApi("get", address.info,{},{token:123}).then(result => {
            console.log(result); 
          })
         .catch(error => {
            console.error(error); 
          });; 
</script>```


http://www.niftyadmin.cn/n/5476992.html

相关文章

ping命令返回无法访问目标主机和请求超时浅析

在日常经常用ping命令测试网络是否通信正常&#xff0c;使用ping命令时也经常会遇到这两种情况&#xff0c;那么表示网络出现了问题。 1、请求超时的原因 可以看到“请求超时”没有收到任何回复。要知道&#xff0c;IP数据报是有生存时间的&#xff0c;当其生存时间为零时就会…

路由器端口映射是什么意思?

路由器端口映射是一种网络配置技术&#xff0c;在私有网络中允许外部网络访问特定的服务或应用程序。通过将路由器的端口映射到内部客户端设备&#xff0c;可以实现从公共网络访问内部网络资源的目的。 天联组网介绍 天联是一款异地组网内网穿透产品&#xff0c;由北京金万维科…

ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录

文章目录 截图1.在开发者网站的app id中添加Sign in with Apple功能2.在Xcode中添加Sign in with Apple功能3.代码&#xff1a;只有第一次登录的时候可以获取到用户名参考博客chatGPT答案 截图 1.在开发者网站的app id中添加Sign in with Apple功能 1.1 如果你新建app id,记得在…

Node.js从基础到高级运用】二十二、同步执行的子进程

引言 在 Node.js 的应用程序中&#xff0c;我们有时候需要在父进程中同步地执行子进程&#xff0c;这对于需要顺序执行任务或者处理命令行工具的输出特别有用。child_process 模块在 Node.js 中用于创建子进程&#xff0c;并且提供了几种同步执行子进程的方法。在 Windows 系统…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

企业版ChatGPT用户激增至60万;百度文心一言推出个性化声音定制功能

&#x1f989; AI新闻 &#x1f680; 企业版ChatGPT用户激增至60万 摘要&#xff1a;OpenAI首席运营官Brad Lightcap在接受采访时透露&#xff0c;企业版ChatGPT的注册用户已超60万&#xff0c;相较2024年1月的15万用户&#xff0c;短短三个月内增长了300%。这一版本自2023年…

Docker速成:新手变专家!

Docker介绍 容器历史 1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail &#xff08;监狱&#xff09;实现了操作系统级别的虚拟化&#xff0c;他…

AI日报:北大Open Sora视频生成更强了;文心一言可以定制你自己的声音;天工 SkyMusic即将免费开放;

&#x1f916;&#x1f4f1;&#x1f4bc;AI应用 北大Open Sora视频生成更强了!时长可达10秒&#xff0c;分辨率更高 【AiBase提要:】 ⭐️ Open-Sora-Plan v1.0.0模型发布 显著提升视频生成质量和文本控制能力 ⭐️ 支持华为昇腾910b芯片&#xff0c;提升运行效率和质量。 ⭐…