Ajax 與 Axios 非同步請求 一、伺服器對外提供了哪些資源 1. 網頁中如何請求數據 數據,也是伺服器對外提供的一種資源。只要是資源,必然要通過 請求 – 處理 – 響應 的方式進行獲取。如果要在網頁中請求伺服器上的數據資源,則需要用到 XMLHttpRequest 對象。XMLHttpReq ...
Ajax 與 Axios 非同步請求
一、伺服器對外提供了哪些資源
1. 網頁中如何請求數據
數據,也是伺服器對外提供的一種資源。只要是資源,必然要通過 請求 – 處理 – 響應 的方式進行獲取。如果要在網頁中請求伺服器上的數據資源,則需要用到 XMLHttpRequest 對象。XMLHttpRequest(簡稱 xhr)是瀏覽器提供的 js 成員,通過它,可以請求伺服器上的數據資源。最簡單的用法 var xhrObj = new XMLHttpRequest()
2. 資源的請求方式
客戶端請求伺服器時,請求的方式有很多種,最常見的兩種請求方式分別為 get 和 post 請求。
-
get 請求通常用於獲取服務端資源(向伺服器要資源)
例如:根據 URL 地址,從伺服器獲取 HTML 文件、css 文件、js文件、圖片文件、數據資源等
-
post 請求通常用於向伺服器提交數據(往伺服器發送資源)
例如:登錄時向伺服器提交的登錄信息、註冊時向伺服器提交的註冊信息、添加用戶時向伺服器提交的用戶信息等各種數據提交操作
二、Ajax
非同步請求
1. 什麼是Ajax
Ajax 的全稱是 Asynchronous Javascript And XML(非同步 JavaScript 和 XML)。通俗的理解:在網頁中利用 XMLHttpRequest 對象和伺服器進行數據交互的方式,就是Ajax。
瀏覽器中提供的 XMLHttpRequest 用法比較複雜,所以 jQuery 對 XMLHttpRequest 進行了封裝,提供了一系列 Ajax 相關的函數,極大地降低了 Ajax 的使用難度
2. 為什麼要學Ajax
之前所學的技術,只能把網頁做的更美觀漂亮,或添加一些動畫效果,但是,Ajax能讓我們輕鬆實現網頁與伺服器之間的數據交互。
3. Ajax的典型應用場景
- 用戶名檢測:註冊用戶時,通過
ajax
的形式,動態檢測用戶名是否被占用 - 搜索提示:當輸入搜索關鍵字時,通過
ajax
的形式,動態載入搜索提示列表 - 數據分頁顯示:當點擊頁碼值的時候,通過
ajax
的形式,根據頁碼值動態刷新表格的數據 - 數據的增刪改查:數據的添加、刪除、修改、查詢操作,都需要通過
ajax
的形式,來實現數據的交互
4. Ajax 的應用
-
jQuery 中發起 Ajax 請求最常用的三個方法
// get請求 $.get() // post請求 $.post() // 通用請求 $.ajax()
-
$.get()函數的語法
jQuery 中 $.get() 函數的功能單一,專門用來發起 get 請求,從而將伺服器上的資源請求到客戶端來進行使用。$.get() 函數的語法如下:
-
$.get() 函數的語法如下:
$.get(url, [data], [callback])
-
其中,三個參數各自代表的含義如下:
參數名 參數類型 是否必選 說明 url
string 是 要請求的資源地址 data object 否 請求資源期間要攜帶的參數 callback function 否 請求成功時的回調函數 -
$.get()發起不帶參數的請求
// 使用 $.get() 函數發起不帶參數的請求時,直接提供請求的 URL 地址和請求成功之後的回調函數即可: $.get("http://ajax-base-api-t.itheima.net/api/getbooks", function(res) { console.log(res) // 這裡的 res 是伺服器返回的數據 })
-
$.get()發起帶參數的請求
// 使用 $.get() 函數發起帶參數的請求時,示例代碼如下: $.get("http://ajax-base-api-t.itheima.net/api/getbooks", { id: 1 }, function(res) { console.log(res) })
-
-
$.post()函數的語法
jQuery 中 $.post() 函數的功能單一,專門用來發起 post 請求,從而向伺服器提交數據。
-
$.post() 函數的語法如下:
$.post(url, [data], [callback])
-
其中,三個參數各自代表的含義如下:
參數名 參數類型 是否必選 說明 url
string 是 提交數據的地址 data object 否 要提交的數據 callback function 否 數據提交成功時的回調函數 -
$.post()向伺服器提交數據
// 使用 $post() 向伺服器提交數據的示例代碼如下: $.post( "http://ajax-base-api-t.itheima.net/api/addbook", // 請求的URL地址 { bookname: '水滸傳', author: '施耐庵', publisher: '上海圖書出版社' }, // 提交的數據 function(res) { // 回調函數 console.log(res) } )
-
-
$.ajax()
函數的語法相比於 $.get() 和 $.post() 函數,jQuery 中提供的 $.ajax() 函數,是一個功能比較綜合的函數,它允許我們對 Ajax 請求進行更詳細的配置。
-
$.ajax()
函數的基本語法如下:$.ajax({ type: '', // 請求的方式,例如 GET 或 POST url: '', // 請求的 URL 地址 data: { },// 這次請求要攜帶的數據 success: function(res) { } // 請求成功之後的回調函數 })
-
使用
$.ajax()
發起GET請求// 使用 $.ajax() 發起 GET 請求時,只需要將 type 屬性的值設置為 'GET' 即可: $.ajax({ type: 'GET', // 請求的方式 url: "http://ajax-base-api-t.itheima.net/api/getbooks", // 請求的 URL 地址 data: { id: 1 },// 這次請求要攜帶的數據 success: function(res) { // 請求成功之後的回調函數 console.log(res) } })
-
GET請求實戰案例前後端交互
-
前端代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>加法運算</title> <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> </head> <body> <div> <h3>ajax GET請求頁面</h3> <input type="text"> + <input type="text"> = <input type="text"> <input type="button" value="計算"> </div> <script> let nums = $("input[type='text']"); let btn = $("input[type='button']"); btn.click(function (){ // 發起get請求: http://127.0.0.1:8888/calc?num1=1.3&num2=3.6 $.ajax({ url:"/calc", type:"get", dataType:"json", data:{ "num1": Number(nums.eq(0).val()), "num2": Number(nums.eq(1).val()) }, success:function (response) { console.log("響應數據:",response); console.log("響應數據類型:",typeof(response)); nums.eq(2).val(response["result"]); }, error:function (error) { console.log(error.readyState); console.log(error.status); console.log(error.statusText); console.log(error.responseText); } }) }) </script> </body> </html>
-
後端代碼
import tornado.web import tornado.ioloop class MainHandler(tornado.web.RequestHandler): def get(self): self.render("calc_get.html") class ReferHandler(tornado.web.RequestHandler): def get(self): # print("請求頭信息\n:", self.request.headers) print("請求url: ", self.request.full_url()) # 獲取原始查詢參數和請求體參數 print("查詢參數:", self.request.arguments) print("請求體參數:", self.request.body) # 框架解析之後的數據, 如果原始查詢參數無數據則報錯 num1 = self.get_argument("num1") num2 = self.get_argument("num2") # 通過url以鍵值對形式傳參解析出來的數據均為字元串格式 print("接收的查詢參數num1類型為", type(num1)) print("接收的查詢參數num1, num2值為", num1, num2) result = round(float(num1) + float(num2), 4) # .write會檢測參數,將字典轉為json數據以後返回 self.write({"result": result}) if __name__ == '__main__': app = tornado.web.Application([ ("/", MainHandler), ("/calc", ReferHandler), ]) app.listen(8888) tornado.ioloop.IOLoop.current().start()
-
-
-
使用
$.ajax()
發起POST請求// 使用 $.ajax() 發起 POST 請求時,只需要將 type 屬性的值設置為 'POST' 即可: $.ajax({ type: 'POST', // 請求的方式 url: "http://ajax-base-api-t.itheima.net/api/addbook", // 請求的 URL 地址 data: { // 要提交給伺服器的數據 bookname: '水滸傳', author: '施耐庵', publisher: '上海圖書出版社' }, success: function(res) { // 請求成功之後的回調函數 console.log(res) } })
-
POST請求實戰案例前後端交互
-
前端代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>加法運算</title> <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> </head> <body> <div> <h3>ajax POST請求頁面</h3> <input type="text"> + <input type="text"> = <input type="text"> <input type="button" value="計算"> </div> <script> let nums = $("input[type='text']"); let btn = $("input[type='button']"); btn.click(function (){ // 發起post請求: http://127.0.0.1:8888 $.ajax({ url:"/", type:"post", // post請求一般會指定發送給伺服器的數據格式 contentType:"application/json", dataType:"json", // 將數據轉換為json格式發送 data:JSON.stringify({ "num1": Number(nums.eq(0).val()), "num2": Number(nums.eq(1).val()) }), success:function (response) { console.log("響應數據:",response); console.log("響應數據類型:",typeof(response)); nums.eq(2).val(response["result"]); }, error:function (error) { console.log(error.readyState); console.log(error.status); console.log(error.statusText); console.log(error.responseText); } }) }) </script> </body> </html>
-
後端代碼
import json import tornado.web import tornado.ioloop class MainHandler(tornado.web.RequestHandler): def get(self): self.render("calc_post.html") def post(self): # print("請求頭信息\n:", self.request.headers) print("請求url: ", self.request.full_url()) # 獲取原始查詢參數和請求體參數 print("查詢參數:", self.request.arguments) print("請求體參數:", self.request.body) # 框架解析之後的數據 data = json.loads(self.request.body) num1 = data["num1"] num2 = data["num2"] print("接收的請求體參數num1類型為", type(num1)) print("接收的請求體參數num1, num2值為", num1, num2) result = round(num1 + num2, 4) # .write會檢測參數,將字典轉為json數據以後返回 self.write({"result": result}) if __name__ == '__main__': app = tornado.web.Application([ ("/", MainHandler), ]) app.listen(8888) tornado.ioloop.IOLoop.current().start()
-
-
-
ajax
非同步請求參數說明【contentType】: 發送給伺服器的數據格式; 可選4種格式: 1> application/x-www-form-urlencoded: 預設方式,在請求發送過程中會對數據進行序列化處理,以鍵值對形式 ?key1=value1&key2=value的方式發送到伺服器 2> multipart/form-data: 需要在表單中進行文件上傳時,就需要使用該格式 3> application/json: 消息主體是序列化後的 JSON 字元串 4> text/plain: 數據以純文本形式(text/json/xml/html)進行編碼,其中不含任何控制項或格式字元 eg: contentType:"application/json", 【dataType】: 用什麼格式解析服務端響應的數據(並非是原生ajax的屬性),有些框架(比如jquery)預設(未填寫dataType或解析錯誤的情況下)讀取服務端的響應頭Content-Type 1> text:預設值。預期數據為純文本字元串。 2> html:預期數據為html格式的字元串。 3> json:預期數據為JSON格式的對象或數組。 4> xml:預期數據為XML文檔類型的數據。 說明: 指定dataType參數後,如果返回的數據類型與預期不符合,則ajax請求會失敗,並觸發error回調函數。因此,正確指定dataType參數對於確保ajax請求的數據類型是非常重要的。 【jquery ajax 出錯信息解讀-error屬性值】 1> readyState :當前狀態,0-未初始化,1-正在載入,2-已經載入,3-數據進行交互,4-完成。 2> status :返回的HTTP狀態碼,比如常見的404,500等錯誤代碼。 3> statusText :對應狀態碼的錯誤信息,比如404錯誤信息是not found,500是Internal Server Error。 4> responseText :伺服器響應返回的文本信息
-
三、 Axios
非同步請求
1. 什麼是axios
Axios 是基於Promise的HTTP客戶端作用於瀏覽器和node.js,專註於網路數據請求的庫。相比於原生的 XMLHttpRequest 對象,axios 簡單易用。相比於 jQuery,axios 更加輕量化,只專註於網路數據請求。
2. axios 的應用
-
axios
發起GET請求-
axios
發起 get 請求的語法:axios.get('url', { params: { /*參數*/ } }).then(callback)
-
具體的請求示例如下:
// 請求的 URL 地址 var url = 'http://ajax-base-api-t.itheima.net/api/get' // 請求的參數對象 var paramsObj = { name: 'zs', age: 20 } // 調用 axios.get() 發起 GET 請求 axios.get(url, { params: paramsObj }).then(function(res) { // res.data 是伺服器返回的數據 var result = res.data console.log(res) })
-
-
axios
發起POST請求-
axios
發起 post 請求的語法:axios.post('url', { /*參數*/ }).then(callback)
-
具體的請求示例如下:
// 請求的 URL 地址 var url = 'http://ajax-base-api-t.itheima.net/api/post' // 要提交到伺服器的數據 var dataObj = { location: '北京', address: '順義' } // 調用 axios.post() 發起 POST 請求 axios.post(url, dataObj).then(function(res) { // res.data 是伺服器返回的數據 var result = res.data console.log(result) })
-
-
直接使用
axios
發起請求-
直接使用
axios
發起請求,axios
也提供了類似於jQuery
中$.ajax()
的函數,語法如下:axios({ method: '請求類型', url: '請求的URL地址', data: { /* POST數據 */ }, params: { /* GET參數 */ } }) .then(callback)
-
直接使用
axios
發起GET請求axios({ method: 'GET', url: 'http://www.liulongbin.top:3006/api/get', params: { // GET 參數要通過 params 屬性提供 name: 'zs', age: 20 } }).then(function(res) { console.log(res.data) })
-
直接使用
axios
發起POST請求axios({ method: 'POST', url: 'http://www.liulongbin.top:3006/api/post', data: { // POST 數據要通過 data 屬性提供 bookname: '程式員的自我修養', price: 666 } }).then(function(res) { console.log(res.data) })
-
四、 介面
-
介面的概念
使用 Ajax 請求數據時,被請求的 URL 地址,就叫做數據介面(簡稱介面)。同時,每個介面必須有請求方式。 例如: http://ajax-base-api-t.itheima.net/api/getbooks 獲取圖書列表的介面(GET請求) http://ajax-base-api-t.itheima.net/api/addbook 添加圖書的介面(POST請求)
-
介面的請求過程
-
介面文檔
-
什麼是介面文檔
介面文檔,顧名思義就是介面的說明文檔,它是我們調用介面的依據。好的介面文檔包含了對介面URL,參數以及輸出內容的說明,我們參照介面文檔就能方便的知道介面的作用,以及介面如何進行調用。
-
介面文檔的組成部分
介面文檔可以包含很多信息,也可以按需進行精簡,不過,一個合格的介面文檔,應該包含以下6項內容,從而為介面的調用提供依據:
- 介面名稱:用來標識各個介面的簡單說明,如登錄介面,獲取圖書列表介面等。
- 介面URL:介面的調用地址
- 調用方式:介面的調用方式,如 GET 或 POST
- 參數格式:介面需要傳遞的參數,每個參數必須包含參數名稱、參數類型、是否必選、參數說明這4項內容
- 響應格式:介面的返回值的詳細描述,一般包含數據名稱、數據類型、說明3項內容。
- 返回示例(可選):通過對象的形式,例舉伺服器返回數據的結構。
-
介面文檔示例
-
圖書列表
-
介面URL:
/api/getbooks
-
調用方式: GET
-
參數格式 -
PTND
:參數名稱( params
)參數類型(type) 是否必選(necessary) 參數說明(description) id
Number 否 圖書Id bookname
String 否 圖書名稱 author
String 否 作者 publisher
String 否 出版社 -
響應格式 -
PTD
:數據名稱 數據類型 說明 status
Number 200 成功;500 失敗; msg
String 對 status 欄位的詳細說明 data
Array 圖書列表 +id
Number 圖書Id +bookname
String 圖書名稱 +author
String 作者 +publisher
String 出版社 -
返回示例:
{ "status": 200, "msg": "獲取圖書列表成功", "data": [ { "id": 1, "bookname": "西游記", "author": "吳承恩", "publisher": "北京圖書出版社" }, { "id": 2, "bookname": "紅樓夢", "author": "曹雪芹", "publisher": "上海圖書出版社" }, { "id": 3, "bookname": "三國演義", "author": "羅貫中", "publisher": "北京圖書出版社" } ] }
-
-
-