最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端JS調(diào)用后端API的3種實(shí)用方法(輕松搞定前后端數(shù)據(jù)交互)

 更新時(shí)間:2025年11月18日 09:28:06   作者:霽月的小屋  
在JavaScript開發(fā)中,調(diào)用接口是前端與后端交互的基礎(chǔ)操作之一,通過調(diào)用接口,前端頁面可以動(dòng)態(tài)獲取數(shù)據(jù),實(shí)現(xiàn)頁面的動(dòng)態(tài)展示與用戶交互,這篇文章主要介紹了前端JS調(diào)用后端API的3種實(shí)用方法,需要的朋友可以參考下

前端js調(diào)用后端API的三種方法

在 Web 開發(fā)中,前端與后端的協(xié)同是實(shí)現(xiàn)功能的核心環(huán)節(jié),而前端通過 JavaScript 調(diào)用后端 API 接口,更是實(shí)現(xiàn)數(shù)據(jù)交互、完成業(yè)務(wù)邏輯的關(guān)鍵步驟。無論是用戶登錄時(shí)的信息驗(yàn)證,還是頁面數(shù)據(jù)的動(dòng)態(tài)加載,都離不開 API 調(diào)用。本文將詳細(xì)介紹三種主流的前端 JS 調(diào)用后端 API 的方法,包括傳統(tǒng)的 XMLHttpRequest、簡化開發(fā)的 jQuery Ajax,以及現(xiàn)代項(xiàng)目常用的 axios 與 fetch,幫助開發(fā)者根據(jù)項(xiàng)目需求選擇合適的方案。

下面主要介紹三種方法來實(shí)現(xiàn)前端js對(duì)后端API接口的調(diào)用:

方法一XMLHttpRequest

方法二jQuery和Ajax

方法三axios、fetch

XMLHttpRequest

XMLHttpRequest(簡稱 XHR)是瀏覽器提供的原生 API,也是前端調(diào)用后端 API 的 “鼻祖” 級(jí)方案。它不依賴任何第三方庫,兼容性極強(qiáng),能在幾乎所有主流瀏覽器中運(yùn)行,適合需要兼顧老舊瀏覽器的項(xiàng)目。

(1)創(chuàng)建XMLHttpRequest對(duì)象;

(2)建立http連接;

(3)發(fā)送請(qǐng)求;

(4)獲取返回?cái)?shù)據(jù)。

1.核心原理

通過創(chuàng)建 XMLHttpRequest 對(duì)象,配置請(qǐng)求方式(GET、POST 等)、請(qǐng)求 URL、是否異步等參數(shù),然后發(fā)送請(qǐng)求;同時(shí)監(jiān)聽對(duì)象的狀態(tài)變化,當(dāng)請(qǐng)求完成且響應(yīng)成功時(shí),獲取后端返回的數(shù)據(jù)并進(jìn)行處理。

Post請(qǐng)求與Get請(qǐng)求主要有兩點(diǎn)不同:
①post請(qǐng)求需要設(shè)置請(qǐng)求頭的格式內(nèi)容:xhr.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);
②post請(qǐng)求參數(shù)放在send里面,即請(qǐng)求體

2.實(shí)現(xiàn)步驟與代碼示例

// 1. 創(chuàng)建XMLHttpRequest對(duì)象
const xhr = new XMLHttpRequest();

// 2. 配置請(qǐng)求(請(qǐng)求方法、URL、是否異步)
// GET請(qǐng)求:若需傳參,可在URL后拼接(如"?id=1&name=test")
xhr.open('GET', 'https://api.example.com/user/list', true);

// 3. 設(shè)置請(qǐng)求頭(可選,根據(jù)后端要求配置,如POST請(qǐng)求傳JSON需設(shè)置)
// 若為POST請(qǐng)求,需添加:xhr.setRequestHeader('Content-Type', 'application/json');

// 4. 監(jiān)聽請(qǐng)求狀態(tài)變化,處理響應(yīng)
xhr.onreadystatechange = function() {
  // readyState=4表示請(qǐng)求已完成,status=200表示響應(yīng)成功
  if (xhr.readyState === 4 && xhr.status === 200) {
    // 解析后端返回的JSON數(shù)據(jù)(若返回非JSON則直接用xhr.responseText)
    const responseData = JSON.parse(xhr.responseText);
    console.log('請(qǐng)求成功,返回?cái)?shù)據(jù):', responseData);
    // 后續(xù)業(yè)務(wù)邏輯:如渲染頁面數(shù)據(jù)
  } else if (xhr.readyState === 4) {
    // 請(qǐng)求完成但響應(yīng)失敗(如404、500錯(cuò)誤)
    console.error('請(qǐng)求失敗,狀態(tài)碼:', xhr.status);
  }
};

// 5. 發(fā)送請(qǐng)求(POST請(qǐng)求需傳參,如xhr.send(JSON.stringify({id: 1})))
xhr.send();

// 6. 處理網(wǎng)絡(luò)錯(cuò)誤
xhr.onerror = function() {
  console.error('網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)求無法發(fā)送');
};

3. 優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):原生 API,無依賴;兼容性好,支持老舊瀏覽器(如 IE6+)。

  • 缺點(diǎn):代碼繁瑣,需手動(dòng)處理請(qǐng)求狀態(tài)、錯(cuò)誤和數(shù)據(jù)解析;不支持 Promise,無法使用 async/await 簡化異步代碼。

jQuery Ajax

Query 是早期前端開發(fā)中常用的 JavaScript 庫,它對(duì) XMLHttpRequest 進(jìn)行了封裝,提供了簡潔的 Ajax 方法,大幅減少了代碼量,讓 API 調(diào)用更高效。

1. 核心原理

基于 XMLHttpRequest 封裝,通過統(tǒng)一的.ajax()方法整合請(qǐng)求配置,內(nèi)置了數(shù)據(jù)解析、錯(cuò)誤處理等邏輯,同時(shí)提供.ajax()方法整合請(qǐng)求配置,內(nèi)置了數(shù)據(jù)解析、錯(cuò)誤處理等邏輯,同時(shí)提供.ajax()方法整合請(qǐng)求配置,內(nèi)置了數(shù)據(jù)解析、錯(cuò)誤處理等邏輯,同時(shí)提供.get()、$.post()等簡化方法,降低開發(fā)成本。

2. 實(shí)現(xiàn)步驟與代碼示例

jquary調(diào)用ajax方法:

? 格式:$.ajax({});

? 參數(shù):

? type:請(qǐng)求方式GET/POST

? url:請(qǐng)求地址

? async:是否異步,默認(rèn)是true表示異步

? data:發(fā)送到服務(wù)器的數(shù)據(jù)

? dataType:預(yù)期服務(wù)器返回的數(shù)據(jù)類型

? contentType:設(shè)置請(qǐng)求頭

? error:請(qǐng)求失敗時(shí)調(diào)用此函數(shù)

get請(qǐng)求

<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
$.ajax({
  url: 'https://api.example.com/user/add', // 請(qǐng)求URL
  type: 'POST', // 請(qǐng)求方法(GET/POST/PUT/DELETE等)
  contentType: 'application/json', // 發(fā)送數(shù)據(jù)的格式
  data: JSON.stringify({ // 發(fā)送給后端的數(shù)據(jù)
    name: '張三',
    age: 25
  }),
  dataType: 'json', // 預(yù)期后端返回的數(shù)據(jù)格式(自動(dòng)解析)
  success: function(response) { // 請(qǐng)求成功回調(diào)
    console.log('添加用戶成功:', response);
  },
  error: function(xhr, status, error) { // 請(qǐng)求失敗回調(diào)
    console.error('添加用戶失?。?, status, error);
  },
  complete: function() { // 請(qǐng)求完成(無論成功/失?。┗卣{(diào)
    console.log('請(qǐng)求結(jié)束');
  }
});

(2)簡化方法:.get()與.get()與.get().post()

適用于簡單的 GET/POST 請(qǐng)求,無需復(fù)雜配置:

$.get();
	語法:
    $.get("請(qǐng)求地址","請(qǐng)求參數(shù)",function(形參){
        
    });
$.post();
	語法:
    $.post("請(qǐng)求地址","請(qǐng)求參數(shù)",function(形參){
        
    });
// GET請(qǐng)求:獲取用戶列表
$.get('https://api.example.com/user/list', { page: 1, size: 10 }, function(response) {
  console.log('用戶列表:', response);
}, 'json').fail(function(error) {
  console.error('獲取失?。?, error);
});

// POST請(qǐng)求:添加用戶
$.post('https://api.example.com/user/add', { name: '李四', age: 30 }, function(response) {
  console.log('添加成功:', response);
}, 'json').fail(function(error) {
  console.error('添加失敗:', error);
});

3. 優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):代碼簡潔,封裝完善;內(nèi)置錯(cuò)誤處理和數(shù)據(jù)解析;支持鏈?zhǔn)秸{(diào)用。

  • 缺點(diǎn):需引入 jQuery 庫,增加頁面加載體積;現(xiàn)代單頁應(yīng)用(如 Vue、React 項(xiàng)目)中,通常不依賴 jQuery,易造成冗余。

axios fetch

隨著前端技術(shù)的發(fā)展,Promise 成為異步編程的標(biāo)準(zhǔn),axios 和 fetch 應(yīng)運(yùn)而生。它們基于 Promise,支持 async/await 語法,更符合現(xiàn)代前端開發(fā)習(xí)慣,是 Vue、React、Angular 等框架項(xiàng)目的首選。

1. axios:功能強(qiáng)大的 Promise 庫

axios 是一個(gè)基于 Promise 的 HTTP 客戶端,支持瀏覽器和 Node.js 環(huán)境,提供了攔截請(qǐng)求 / 響應(yīng)、取消請(qǐng)求、自動(dòng)轉(zhuǎn)換 JSON 數(shù)據(jù)等豐富功能。

(1)使用步驟

首先需安裝 axios(npm/yarn)或通過 CDN 引入:

# npm安裝
npm install axios
# 或CDN引入
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
// 1. 基礎(chǔ)GET請(qǐng)求(帶參數(shù))
axios.get('https://api.example.com/user/list', {
  params: { page: 1, size: 10 } // 自動(dòng)拼接為URL參數(shù)
})
.then(function(response) {
  console.log('請(qǐng)求成功:', response.data); // response.data直接是解析后的JSON
})
.catch(function(error) {
  // 統(tǒng)一處理錯(cuò)誤(包括網(wǎng)絡(luò)錯(cuò)誤、404、500等)
  if (error.response) {
    // 有響應(yīng)但狀態(tài)碼錯(cuò)誤
    console.error('響應(yīng)錯(cuò)誤,狀態(tài)碼:', error.response.status);
    console.error('錯(cuò)誤數(shù)據(jù):', error.response.data);
  } else if (error.request) {
    // 無響應(yīng)(網(wǎng)絡(luò)錯(cuò)誤)
    console.error('網(wǎng)絡(luò)錯(cuò)誤,無響應(yīng):', error.request);
  } else {
    // 請(qǐng)求配置錯(cuò)誤
    console.error('請(qǐng)求配置錯(cuò)誤:', error.message);
  }
});

// 2. 基礎(chǔ)POST請(qǐng)求(傳JSON數(shù)據(jù))
axios.post('https://api.example.com/user/add', {
  name: '王五',
  age: 28
}, {
  headers: { 'Content-Type': 'application/json' } // 可選,默認(rèn)已支持JSON
})
.then(response => {
  console.log('添加成功:', response.data);
})
.catch(error => {
  console.error('添加失?。?, error);
});

// 3. 結(jié)合async/await(更簡潔的異步寫法)
async function getUserList() {
  try {
    const response = await axios.get('https://api.example.com/user/list', {
      params: { page: 1, size: 10 }
    });
    console.log('用戶列表:', response.data);
    return response.data;
  } catch (error) {
    console.error('獲取失?。?, error);
    throw error; // 拋出錯(cuò)誤供上層處理
  }
}
// 調(diào)用函數(shù)
getUserList();

// 4. 高級(jí)功能:請(qǐng)求攔截器(添加Token等)
axios.interceptors.request.use(
  config => {
    // 給所有請(qǐng)求添加Token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

2. fetch調(diào)用API接口使用方法

fetch 是 ES6 引入的瀏覽器原生 API,基于 Promise,無需依賴第三方庫,設(shè)計(jì)更簡潔,是現(xiàn)代瀏覽器的原生選擇。但需注意其部分 “特殊行為”(如不默認(rèn)攔截 HTTP 錯(cuò)誤狀態(tài)碼)。

// 1. 基礎(chǔ)GET請(qǐng)求
fetch('https://api.example.com/user/list?page=1&size=10')
.then(function(response) {
  // 注意:fetch僅在網(wǎng)絡(luò)錯(cuò)誤時(shí) reject,404、500等狀態(tài)碼仍會(huì) resolve
  if (!response.ok) {
    // 手動(dòng)處理HTTP錯(cuò)誤
    throw new Error(`請(qǐng)求失敗,狀態(tài)碼:${response.status}`);
  }
  // 解析響應(yīng)數(shù)據(jù)(支持json()、text()、blob()等)
  return response.json();
})
.then(function(data) {
  console.log('用戶列表:', data);
})
.catch(function(error) {
  console.error('請(qǐng)求錯(cuò)誤:', error.message);
});

// 2. 基礎(chǔ)POST請(qǐng)求(傳JSON數(shù)據(jù))
fetch('https://api.example.com/user/add', {
  method: 'POST', // 請(qǐng)求方法
  headers: {
    'Content-Type': 'application/json' // 數(shù)據(jù)格式
  },
  body: JSON.stringify({ name: '趙六', age: 32 }), // 發(fā)送的數(shù)據(jù)(需轉(zhuǎn)為字符串)
  credentials: 'include' // 跨域時(shí)攜帶Cookie(可選)
})
.then(response => {
  if (!response.ok) {
    throw new Error(`狀態(tài)碼錯(cuò)誤:${response.status}`);
  }
  return response.json();
})
.then(data => {
  console.log('添加成功:', data);
})
.catch(error => {
  console.error('添加失敗:', error);
});

// 3. 結(jié)合async/await
async function addUser() {
  try {
    const response = await fetch('https://api.example.com/user/add', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: '孫七', age: 26 })
    });
    if (!response.ok) {
      throw new Error(`請(qǐng)求失?。?{response.status}`);
    }
    const data = await response.json();
    console.log('添加成功:', data);
    return data;
  } catch (error) {
    console.error('錯(cuò)誤:', error);
    throw error;
  }
}
// 調(diào)用函數(shù)
addUser();

fetch 的 “特殊注意點(diǎn)”

  • 不默認(rèn)攔截 HTTP 錯(cuò)誤:即使?fàn)顟B(tài)碼為 404、500,fetch 仍會(huì)進(jìn)入then回調(diào),需通過response.ok(true表示 200-299 狀態(tài)碼)手動(dòng)判斷。

  • 不自動(dòng)攜帶 Cookie:跨域請(qǐng)求時(shí)需添加credentials: 'include’配置,同域請(qǐng)求需添加credentials: ‘same-origin’。

無內(nèi)置超時(shí)處理:需手動(dòng)通過Promise.race()實(shí)現(xiàn)超時(shí)控制。

3. axios 與 fetch 的優(yōu)缺點(diǎn)對(duì)比

特性axiosfetch依賴需安裝第三方庫瀏覽器原生,無依賴HTTP 錯(cuò)誤處理自動(dòng)攔截(404、500 等會(huì) reject)需手動(dòng)通過 response.ok 判斷數(shù)據(jù)解析自動(dòng)解析 JSON 數(shù)據(jù)需手動(dòng)調(diào)用 response.json ()超時(shí)控制內(nèi)置 timeout 配置需手動(dòng)實(shí)現(xiàn)攔截器支持請(qǐng)求 / 響應(yīng)攔截器需手動(dòng)封裝兼容性支持 IE8+(需配合 es6-promise)僅支持現(xiàn)代瀏覽器(IE 不支持)

總結(jié)與選擇建議

三種前端 JS 調(diào)用后端 API 的方法各有優(yōu)劣,選擇時(shí)需結(jié)合項(xiàng)目場景、瀏覽器兼容性要求和開發(fā)效率:

  • 若需兼容老舊瀏覽器(如 IE6+),或項(xiàng)目無第三方庫依賴,XMLHttpRequest是唯一選擇;

  • 若項(xiàng)目已引入 jQuery,或需快速實(shí)現(xiàn)簡單 API 調(diào)用,jQuery Ajax能簡化代碼;

  • 若為現(xiàn)代單頁應(yīng)用(Vue/React/Angular),或需豐富功能(如攔截器、超時(shí)控制),axios是最優(yōu)解;

  • 若項(xiàng)目追求 “零依賴” 且僅支持現(xiàn)代瀏覽器,fetch可作為輕量選擇(需處理其特殊行為)。

前端技術(shù)不斷迭代,但 API 調(diào)用的核心邏輯始終是 “發(fā)送請(qǐng)求 - 處理響應(yīng) - 處理錯(cuò)誤”。掌握這三種方法,能讓你在不同項(xiàng)目中靈活應(yīng)對(duì)前后端交互需求。你在實(shí)際開發(fā)中更傾向于使用哪種方法?歡迎在評(píng)論區(qū)分享你的經(jīng)驗(yàn)!

相關(guān)文章

最新評(píng)論

治多县| 虞城县| 大渡口区| 漳浦县| 海原县| 忻州市| 鹤山市| 溆浦县| 环江| 黄龙县| 海淀区| 祁东县| 儋州市| 南投市| 彩票| 平乡县| 新巴尔虎左旗| 五莲县| 临沭县| 买车| 集贤县| 托克托县| 郯城县| 察雅县| 荃湾区| 武川县| 莱阳市| 天水市| 镇坪县| 九龙县| 茌平县| 宁安市| 冕宁县| 莱阳市| 同德县| 万盛区| 漳平市| 宣化县| 尼勒克县| 五莲县| 昆明市|