xhr/fetch/axios串api

閱讀時間約 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);
});
});






    3會員
    17內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    郭欣玫的沙龍 的其他內容
    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
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    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
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    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,無庸置疑的,汽車產業