对於新手来说,AJAX课题里比较难懂的部分应该是背後的运作概念,而非程序码本身。这个课题会分开几篇,这篇会先整理有关基本概念与一些术语的意思,下篇开始就会集中讲实际操作部分(Fetch、axios等等)以及串接API时的常见问题及处理。
今天会整理以下的知识:
XML
、JSON
(最常见)整体流程:
浏览器 ----(HTTP request)----> 服务器 <--> 资料库
浏览器 <----(HTTP response)---- 服务器 <--> 资料库
在网页使用AJAX技术与服务器互动,最旧的方法是透过XMLhttprequest
语法所产生的物件来完成。但因为现时在处理较复杂的需求时,XMLhttprequest
语法结构会变得不好阅读,所以现时比较建议用fetch
、axios
套件等来取代XMLhttprequest
。
在AJAX这个课题里,我们经常会听到「API」这个术语,也常常听到「API接口」这个词,它们到底是代表什麽呢?这里推荐Huli详细但不难懂的文章,这篇文章真的拯救了对API一知半解的我QQ
文中以USB介面比喻API,USB介面使我们可以连接USB随身碟和电脑(纵使市面上有各种不同厂商生产的USB随身碟)。API也一样,它是用来「串接一个程序和另一个程序」,例子如下:
以上例子中,Facebook登入和Google Map地图,这些都是它们公司自己的功能,如果我要在我写的程序里都有这些功能,我就要去串接这些公司提供的API。
这时候我们需要查看这些公司所提供的API文件(API documentation),看看如何串接它们的API。我们称这种API做Web API,因为我们是透过网络来传送资料。这些文件会提供一个网址,这个网址就是我们常常说的「API接口」。同时,文件也会提及我们需要填上的参数,使我们可以向这个网址发出请求,最後令服务器传回资料给我们。
例如我想在我的网页显示GitHub上某个专案的commit纪录。在GitHub的API文件中,我会找到它提供的API接口,{}
里的东西是由自己填写。
此外,图中可见GitHub也会提供参数,让我们能更针对去找出特定资料。例如我可以写成以下的URL,当中用&
去区隔开不同的参数:
https://api.github.com/repos/vuejs/vue/commits?per_page=3&sha=dev
以上写法就是每页显示3笔在dev分支的commit纪录。
在谈及HTTP方法前,我们需要了解什麽是HTTP。HTTP是一个协定,全写是超文本传输协定 (Hypertext Transfer Protocol)。它统一了客户端(client side)与服务器(server side)之间传输资料的方法,例如我要浏览Facebook页面,就会做以下的事:
我这边的浏览器要按特定规范来发出request,之後服务器也要按特定规范来送回response,这就是HTTP协定。
整个流程就是本文一开始提及的AJAX流程:
浏览器 ----(HTTP request)----> 服务器 <--> 资料库
浏览器 <----(HTTP response)---- 服务器 <--> 资料库
当我们在浏览器发出HTTP要求,就会用到在HTTP协定的规范中定义的不同HTTP请求方法,最常见的有:
PUT
和PATCH
都是用来更新资料。差异之处是,PUT
是取代整个资料,而PATCH
只是更新部分资料。另外注意,HTML的的表单只能用GET或POST方法,不能以此两个以外的方法。
服务器会根据浏览器提出的HTTP要求回传相应的资料。此外,当中也会一并回传HTTP状态码,用作显示资料传送的状态。
以下简单划分不同HTTP状态码:
详细的HTTP状态码可看这篇。
我们可以利用这些状态码来做错误处理。例如在学习XMLhttpresquest
时,我们常常会透过if...else
判断status === 200
,从而处理错误情况:
const xhr = new XMLHttpRequest();
xhr.open('get','https://randomuser.me/api/',true);
xhr.send(null);
//状态码:200代表成功。我们利用此状态码去做判断,做到错误处理
xhr.onload = () => {
if(xhr.status === 200){
console.log(JSON.parse(xhr.responseText));
}else{
console.log('请求失败!')
}
}
AJAX基本概念:
API意思:
HTTP协定:
AJAX 完整解说系列:基础观念
AJAX与Fetch API
轻松理解 Ajax 与跨来源请求
>>: Nice day 27 (iphone10s 功能挖掘)-读书辅助器延伸
这个章节,我们将谈到 test()的部分。 进入主题之前,我们要注意的是,test_loader是固...
struct() 用於建立自定义资料结构的命令,其中可以包含多个不同型别的成员,就像是把多个不同型别...
前情提要: 写了30天关於JavaScript文章,只有一个强烈的感觉: 真的像是在追一个人,而且是...
848. Shifting Letters https://leetcode.com/problem...
本篇介绍使用slick.js轮播套件应用在两列以上的轮播功能以及介绍slickGoTo()方法 线...