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);
});
});






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
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(