iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
自我挑戰組

登堂入室!前端工程師的觀念技術 _30_ 題系列 第 11

10. 解釋 AJAX 的工作原理(XMLHttpRequest)

  • 分享至 

  • xImage
  •  

在前兩篇解釋Event Loop的文章:
7. 解釋 Event Loop ( 上 ) --- Call Stack
8. 解釋 Event Loop ( 下 ) --- Task Queue ( Callback Queue )
只有解釋同步與非同步的概念,並沒有應用實際的例子。

所以今天的文章,會以 XMLHttpRequest 作為實際應用的例子!

AJAX


定義

AJAX 原文是 Asynchronous JavaScript and XML,意為 非同步的JavaScript和XML。

AJAX 的原理是在Client與Server間多設置一層AJAX引擎,使Client和Server能進行非同步的資料傳送。 AJAX引擎自己會處理一些數據驗證和處理,並不會將所有請求(request)轉交給Server,只有確定需要讀取新數據時,才由AJAX引擎像Server遞交新的需求。

(如果對API或Client/Server不熟悉的人,可以參考這篇文章:API是什麼?認識 Web API、HTTP 和 JSON 資料交換格式|ALPHA Camp Blog

AJAX 並非一門特定的技術,而是指稱在Client(客戶端)和Server(伺服器)進行資料交換時,會使用到的多個既有技術,包含JavaScript、XMLHTTPRequest、DOM...等。AJAX引擎會監聽回應(respond),然後從server獲得數據,再用JavaScript來操作DOM而更新頁面,因此能做到非同步的資料傳遞。

  • Asynchronous:非同步,指運行程式碼的方式。
  • JavaScript:指運行的程式語言。
  • XML:AJAX可以傳送並接收多種格式的資訊,XML則是其中一種資料格式,也包括 JSON、HTML或文字檔案。

舉例來說,假設我們想要看現在的氣溫,以GOOGLE的頁面為例:
https://ithelp.ithome.com.tw/upload/images/20210911/201294769Xh0BbLH0D.png

我們知道氣溫隨時都有變化,但每當氣溫有變化時,
只有氣溫的數字會改變,這個網頁不會全部開始重跑。

不必重新載入整個頁面,就能對伺服器發送請求、獲得資料。

因此能 增加效率和提升使用者體驗 ,這就是AJAX應用最大的優點與特色。

AJAX 可以使用 XMLHttpRequest 物件來與伺服器進行通訊,今天我們先以 XMLHttpRequest 為例:

XMLHttpRequest


XMLHttpRequest 雖然名字是 XML 與 HTTP 等,但能接收的資料並不限於 XML 類型。

假設今天要製作一個能夠顯示當下氣溫的範例:
https://ithelp.ithome.com.tw/upload/images/20210911/201294767wWxISYt9g.png
(用codepen完成的結果截圖)

氣溫資料的API來自中央氣象局開放資料平臺API,API網站可以依照自己的需求填入資料,產生URL。

獲得網址後,可以用網址打開一個新頁面查找自己需要的資料:
https://ithelp.ithome.com.tw/upload/images/20210911/20129476WLaBLJVZ5E.png
(因為我有用整理JSON的應用程式擴充,選取資料的位置可以直接參考圖片紅框)

!! 因為政府開放資料平台是要申辦帳號才能獲得授權碼的,
如果有人要複製範例使用的話,記得把程式碼裡的"授權碼"中文字樣改掉

附上【JavaScript】的完整程式碼:
(註解都寫在程式碼裡。)

  const section = document.querySelector('section');

  // 獲得URL; 請記得將授權碼字樣替換掉!
  var requestURL = 'https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-D0047-063?Authorization=授權碼&limit=1&offset=7&format=JSON&elementName=T';

  // 建立XMLHttpRequest物件
  var request = new XMLHttpRequest();

  //request.open() 初始化一個請求,使用GET方法
  request.open('GET', requestURL); 
  
  //定義回應內容的資料類型(response type)
  request.responseType = 'json'; 
  
  //送出請求,因為request method為GET,所以參數為空
  request.send(); 

  // onload是一種XMLHttpRequest的屬性,這裡是處理load事件
  request.onload = function() {
     //將回應資料的內容存入變數
      var temperatureData = request.response;
      showWeather(temperatureData);
  }

  function showWeather(jsonObj) { 
      // JSON的資料位置
      var jsonT = jsonObj['records']['locations'][0]['location'][0]['weatherElement'][0]['time'][0]['elementValue'][0]['value'];
      const temperature = document.createElement('h1');
      temperature.textContent = "地點: 台北市, 現在氣溫: " + jsonT + ' °C ';
      section.appendChild(temperature);
  } 

【如內文有誤還請不吝指教>< 謝謝閱覽至此的各位:D】

參考資料:

-----正文結束-----


上一篇
9. 關於 this 的 5 題練習
下一篇
11. 解釋 Callback Hell & 使用Promise
系列文
登堂入室!前端工程師的觀念技術 _30_ 題31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言