xhr/fetch/axios串api

更新於 2024/06/04閱讀時間約 9 分鐘

範例 API 與前置作業

  1. RANDOM USER GENERATOR
  2. 基本架構 :


HTML​ :

<button id="fetch-data">Fetch Data</button>
<div id="data"></div>

Javascript​ :

const fetch-data= document.querySelector("#fetch-data")

const data= document.querySelector("#data")

let apiUrl = 'https://randomuser.me/api/'

let name = ''

let img = ''

let email = ''


  1. xhr

在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。


 fetchDataButton.addEventListener("click", function () {
dataDiv.innerHTML = '<p class="loading">Loading...</p>';

// 使用 XMLHttpRequest 發送 GET 請求到 API
let ​xhr = new XMLHttpRequest();
// 開啟一個請求,這裡使用 GET,true 為非同步的意思
xhr.open("GET", apiUrl, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
try {
const response = JSON.parse(xhr.responseText);
let user = response.results[0];
let userInfo = `
<h2>${user.name.title} ${user.name.first} ${user.name.last}</h2>
<p>Gender: ${user.gender}</p>
<p>Email: ${user.email}</p>
<p>Location: ${user.location.city}, ${user.location.country}</p>
<img src="${user.picture.large}" alt="User Picture">
`;
dataDiv.innerHTML = userInfo;
} catch (e) {
dataDiv.innerHTML = '<p class="error">Error parsing response.</p>';
console.error("Error parsing response:", e);
}
} else {
dataDiv.innerHTML = `<p class="error">Error fetching data. Status: ${xhr.status}</p>`;
}
}
};
// 送出請求
xhr.send();
});



  1. Fetch API:這是瀏覽器原生提供的一個用於數據取得的介面,基於Promise設計,需要手動調用.json轉換為JSON對象。它是Ajax的一種現代化替代方案。
Fetch API 會需要我們手動進行 JSON 解析,所以需要 response.json(),而 Axios 會直接幫我們解析 JSON。


function fetchData() {
fetch("https://randomuser.me/api/")
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok " + response.status);
}
return response.json();
})
.then((data) => {
document.getElementById("output").textContent = JSON.stringify(
data,
null,
2
);
})
.catch((error) => {
console.error("There was a problem with the fetch operation:", error);
document.getElementById("output").textContent = "Error: " + error.message;
});
}


  1. Axios

需要額外引入Axios 庫, Axios 可以在 Node.js 環境中使用。

Axios 預設也會自動處理所有的 HTTP 狀態,包括錯誤的狀態。如果請求成功(HTTP 狀態碼在 200 到 299 之間),則會進入 .then 回調函數;如果請求失敗(HTTP 狀態碼在 200 到 299 以外)則會進入 .catch 回調函數。


fetchDataButton.addEventListener("click", function () {
dataDiv.innerHTML = '<p class="loading">Loading...</p>';

// 使用 axios 發送 GET 請求到 API
axios
.get(apiUrl)
.then(function (response) {
const user = response.data.results[0];
const userInfo = `
<h2>${user.name.title} ${user.name.first} ${user.name.last}</h2>
<p>Gender: ${user.gender}</p>
<p>Email: ${user.email}</p>
<p>Location: ${user.location.city}, ${user.location.country}</p>
<img src="${user.picture.large}" alt="User Picture">
`;
dataDiv.innerHTML = userInfo;
})
.catch(function (error) {
dataDiv.innerHTML = '<p class="error">Error fetching data.</p>';
console.error("Error fetching data:", error);
});
});






    avatar-img
    3會員
    17內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    郭欣玫的沙龍 的其他內容
    1.justify-content 用來控制主軸(水平)如何分配對齊 如果要改垂直對齊的話+上 flex-direction : column 2.align-item 他是控制子項目再交叉軸(垂直)的對齊方式 3.flex-shrink 收縮性! 當空間不足時預設會是1,等於是
    如果製作一個RGB色碼轉換器,算是考驗操作DOM! 那把它分成三個目標來依序完成, 抓slider的數字,存放在各個滑塊右邊的小格子 透過 slider.addEventListener("input", function (event) {...}) 監聽滑塊變動事件。 當事件被觸發時,取得
    以下展示三種置中方法 : <div class="method-container"> <div class="method-title">Flexbox</div> <div class="box"> <div class="dot"></div> </div> </di
    一般而言,組件之間的資料傳遞,可以使用 props 來達成,不過一旦層級過多的時候,props 就要逐層向下傳遞,會越來越麻煩且複雜。 而 provide、inject 可以解決這個問題,它可以提供一個「源頭」,子組件們可以藉由同一個源頭取得對應的資料,且沒有層級分別,都可以取得,就不用逐層傳遞資
    當 父組件 有數據想傳送到 子組件 就可以使用props 1​. 父層傳遞設置 可以在父組件的屬性給予一個值,當作要傳送到子組件的資料。 父層組件​ : <!-- App.vue (父組件) --> <template> <div> <ChildComponent greetin
    CSS Box Model 是在 CSS 裡面,html 的每個元素都可被視作為一個盒子,然後可以針對這個盒子去做調整,看以下圖片: 簡單來說margin就是一個是外邊距,與外層元素的間距 Margin 用於控制元素與其周邊元素的間隔,可以設定為正數(增加與其他元素的距離)、負數(減少與其他
    1.justify-content 用來控制主軸(水平)如何分配對齊 如果要改垂直對齊的話+上 flex-direction : column 2.align-item 他是控制子項目再交叉軸(垂直)的對齊方式 3.flex-shrink 收縮性! 當空間不足時預設會是1,等於是
    如果製作一個RGB色碼轉換器,算是考驗操作DOM! 那把它分成三個目標來依序完成, 抓slider的數字,存放在各個滑塊右邊的小格子 透過 slider.addEventListener("input", function (event) {...}) 監聽滑塊變動事件。 當事件被觸發時,取得
    以下展示三種置中方法 : <div class="method-container"> <div class="method-title">Flexbox</div> <div class="box"> <div class="dot"></div> </div> </di
    一般而言,組件之間的資料傳遞,可以使用 props 來達成,不過一旦層級過多的時候,props 就要逐層向下傳遞,會越來越麻煩且複雜。 而 provide、inject 可以解決這個問題,它可以提供一個「源頭」,子組件們可以藉由同一個源頭取得對應的資料,且沒有層級分別,都可以取得,就不用逐層傳遞資
    當 父組件 有數據想傳送到 子組件 就可以使用props 1​. 父層傳遞設置 可以在父組件的屬性給予一個值,當作要傳送到子組件的資料。 父層組件​ : <!-- App.vue (父組件) --> <template> <div> <ChildComponent greetin
    CSS Box Model 是在 CSS 裡面,html 的每個元素都可被視作為一個盒子,然後可以針對這個盒子去做調整,看以下圖片: 簡單來說margin就是一個是外邊距,與外層元素的間距 Margin 用於控制元素與其周邊元素的間隔,可以設定為正數(增加與其他元素的距離)、負數(減少與其他
    你可能也想看
    Google News 追蹤
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    Thumbnail
    先說重點:「買美債是為了賺價差,故偏好利率敏感度較高的長債」。  台灣股票的配股配息除了要被扣健保補充保費,當所得稅率超過20%,遇到每年5月的繳稅時股利還要計入個人所得再被刮一層皮,雖可透過借券方式避稅降低稅負成本,但向你借券的相對方也不是傻子,個人經驗是會有一定比例在配息前幾天還券,導致無法有
    Thumbnail
    又在那邊收盤發震撼消息,果然不講武德。還好我本來就看空🤣 原來還有理性的機構靜靜的觀察一切。 距離上次美國被調降信評是2011/8/5 然後就一路烙賽。 這次會發生什麼事呢~我們接著看下去 #今天結算見轉折,關鍵位置17238 站上偏多,沒站上偏空 #祝大家操作順利
    Thumbnail
    有多種情況下我們需要從API取消請求: 如果我們正在建立一個支付系統,並且請求一直進行,但使用者希望立即取消這筆訂單。這就是為什麼開發者會建立這個功能的原因。 從電子商務購買商品。使用者意外關閉了頁面,無法立即返回上一頁。 訂閱取消。 ......等等 這將對對這個系統沒有信心的使用者產生影響。因
    AJAX // XHR是什麼: 利用 Javascript 程式進行連線 近期使用最新的 fetch fetch 函示基本語法: 處理不同格式的語法: 根據連線後回傳的資料格式, 寫出相對應的程式 取得純文字資料的回應 取得 JSON 資料的回應 練習:
    Thumbnail
    我從Kas搭巴士到Fethiye,待4天3夜 (2022/9/28-10/1),再從Dalaman機場離開,在Fethiye嘗試了飛行傘、土耳其浴、看世界飛行傘比賽、爺爺們打土耳其麻將等等,在此分享心得跟攻略給大家!
    Thumbnail
    接下來要講前後端怎麼溝通,最常見應該都是用 axios, ajax 或 fetch 來 call api。先講結論,個人推薦使用 axios,那他們又有什麼優缺點呢?讓我簡單講解一下 ajax ajax 用法有點麻煩,要先引入 jQuery,用法如下 ajax 比起 axios 較為笨重也較不安全
    Thumbnail
    Fetch Rewards的企業標語是「make your life easier and more rewarding」。創辦人Wes Schroll在大學時意識到,除非在對的時間、使用對的優惠券、前往對的商店、購買對的產品,才有可能省到一筆小錢,因此才有了設計此App的構想。
    Thumbnail
    「那支二壘安打對我來說就像一見鍾情。」當時執教於小熊,現在則是天使主帥的傳奇教頭梅登(Joe Maddon)說到:「佛萊契(David Fletcher)是那種會在現代棒球裡被忽視的選手。」
    Thumbnail
    全O人壽XHR 保經界實支實付防線最強候補之一,補強其他家不足的住院醫療雜費,門診手術雜費等等,O球人壽的XHR,也是網路上推薦商品組合之前五名,它是你口袋中最重要的實支實付配角之一,但有一點你要注意...
    Thumbnail
    文、圖/BBDO黃禾提供   范孝丹(Daniel Feucht)在上海工作的7年中累積了豐富的行銷經驗。他涉略多重領域,包括體驗行銷、數位以及社群媒體策略發展等等,他更曾與許多一線國際品牌合作,包括保時捷、賓士、Jaguar、Land Rover、Bacardi Group,無庸置疑的,汽車產業
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    Thumbnail
    先說重點:「買美債是為了賺價差,故偏好利率敏感度較高的長債」。  台灣股票的配股配息除了要被扣健保補充保費,當所得稅率超過20%,遇到每年5月的繳稅時股利還要計入個人所得再被刮一層皮,雖可透過借券方式避稅降低稅負成本,但向你借券的相對方也不是傻子,個人經驗是會有一定比例在配息前幾天還券,導致無法有
    Thumbnail
    又在那邊收盤發震撼消息,果然不講武德。還好我本來就看空🤣 原來還有理性的機構靜靜的觀察一切。 距離上次美國被調降信評是2011/8/5 然後就一路烙賽。 這次會發生什麼事呢~我們接著看下去 #今天結算見轉折,關鍵位置17238 站上偏多,沒站上偏空 #祝大家操作順利
    Thumbnail
    有多種情況下我們需要從API取消請求: 如果我們正在建立一個支付系統,並且請求一直進行,但使用者希望立即取消這筆訂單。這就是為什麼開發者會建立這個功能的原因。 從電子商務購買商品。使用者意外關閉了頁面,無法立即返回上一頁。 訂閱取消。 ......等等 這將對對這個系統沒有信心的使用者產生影響。因
    AJAX // XHR是什麼: 利用 Javascript 程式進行連線 近期使用最新的 fetch fetch 函示基本語法: 處理不同格式的語法: 根據連線後回傳的資料格式, 寫出相對應的程式 取得純文字資料的回應 取得 JSON 資料的回應 練習:
    Thumbnail
    我從Kas搭巴士到Fethiye,待4天3夜 (2022/9/28-10/1),再從Dalaman機場離開,在Fethiye嘗試了飛行傘、土耳其浴、看世界飛行傘比賽、爺爺們打土耳其麻將等等,在此分享心得跟攻略給大家!
    Thumbnail
    接下來要講前後端怎麼溝通,最常見應該都是用 axios, ajax 或 fetch 來 call api。先講結論,個人推薦使用 axios,那他們又有什麼優缺點呢?讓我簡單講解一下 ajax ajax 用法有點麻煩,要先引入 jQuery,用法如下 ajax 比起 axios 較為笨重也較不安全
    Thumbnail
    Fetch Rewards的企業標語是「make your life easier and more rewarding」。創辦人Wes Schroll在大學時意識到,除非在對的時間、使用對的優惠券、前往對的商店、購買對的產品,才有可能省到一筆小錢,因此才有了設計此App的構想。
    Thumbnail
    「那支二壘安打對我來說就像一見鍾情。」當時執教於小熊,現在則是天使主帥的傳奇教頭梅登(Joe Maddon)說到:「佛萊契(David Fletcher)是那種會在現代棒球裡被忽視的選手。」
    Thumbnail
    全O人壽XHR 保經界實支實付防線最強候補之一,補強其他家不足的住院醫療雜費,門診手術雜費等等,O球人壽的XHR,也是網路上推薦商品組合之前五名,它是你口袋中最重要的實支實付配角之一,但有一點你要注意...
    Thumbnail
    文、圖/BBDO黃禾提供   范孝丹(Daniel Feucht)在上海工作的7年中累積了豐富的行銷經驗。他涉略多重領域,包括體驗行銷、數位以及社群媒體策略發展等等,他更曾與許多一線國際品牌合作,包括保時捷、賓士、Jaguar、Land Rover、Bacardi Group,無庸置疑的,汽車產業