這篇文章中,我們將介紹一些用于AJAX調用的最好的JS庫,包括jQuery,Axios和Fetch。歡迎查看代碼示例!
AJAX是用來對服務器進行異步HTTP調用的一系列web開發技術客戶端框架。 AJAX即Asynchronous JavaScript and XML(異步JavaScript和XML)。AJAX曾是web開發界的一個常見名稱,許多流行的JavaScript小部件都是使用AJAX構建的。例如,有些特定的用戶交互(如按下按鈕)會異步調用到服務器,服務器會檢索數據并將其返回給客戶端——所有這些都不需要重新加載網頁。
AJAX的現代化重新引入
JavaScript已經進化了,現在我們使用前端庫和/或如React、Angular、Vue等框架構建了動態的網站。AJAX的概念也經歷了重大變化,因為現代異步JavaScript調用涉及檢索JSON而不是XML。有很多庫允許你從客戶端應用程序對服務器進行異步調用。有些進入到瀏覽器標準,有些則有很大的用戶基礎,因為它們不但靈活而且易于使用。有些支持promises,有些則使用回調。在本文中,我將介紹用于從服務器獲取數據的前5個AJAX庫。
Fetch API
Fetch API是XMLHttpRequest的現代替代品,用于從服務器檢索資源。與XMLHttpRequest不同的是,它具有更強大的功能集和更有意義的命名。基于其語法和結構,Fetch不但靈活而且易于使用。但是,與其他AJAX HTTP庫區別開來的是,它具有所有現代Web瀏覽器的支持。Fetch遵循請求-響應的方法,也就是說,Fetch提出請求并返回解析到Response對象的promise。
你可以傳遞Request對象來獲取,或者,也可以僅傳遞要獲取的資源的URL。下面的示例演示了使用Fetch創建簡單的GET請求。
fetch('https://www.example.com', {
method: 'get'
})
.then(response=> response.json())
.then(jsonData=> console.log(jsonData))
.catch(err=> {
//error block
})
正如你所看到的,Fetch的then方法返回了一個響應對象,你可以使用一系列的then 進行進一步的操作。我使用.json() 方法將響應轉換為JSON并將其輸出到控制臺。
假如你需要POST表單數據或使用Fetch創建AJAX文件上傳,將會怎么樣?此時,除了Fetch之外,你還需要一個輸入表單,并使用FormData庫來存儲表單對象。
var input=document.querySelector('input[type="file"]')
var data=new FormData()
data.append('file', input.files[0])
data.append('user', 'blizzerand')
fetch('/avatars', {
method: 'POST',
body: data
})
你可以在官方的Mozilla web文檔中閱讀更多關于Fetch API的信息。
Axios
Axios是一個基于XMLHttpRequest而構建的現代JavaScript庫,用于進行AJAX調用。它允許你從瀏覽器和服務器發出HTTP請求。此外,它還支持ES6原生的Promise API。Axios的其他突出特點包括:
要使用Axios,你需要先安裝它。
npm install axios
下面是一個演示Axios行動的基本例子。
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
與Fetch相比,Axios的語法更簡單。讓我們做一些更復雜的事情,比如我們之前使用Fetch創建的AJAX文件上傳器。
var data=new FormData();
data.append('foo', 'bar');
data.append('file', document.getElementById('file').files[0]);
var config={
onUploadProgress: function(progressEvent) {
var percentCompleted=Math.round( (progressEvent.loaded * 100) / progressEvent.total );
}
};
axios.put('/upload/server', data, config)
.then(function (res) {
output.className='container';
output.innerHTML=res.data;
})
.catch(function (err) {
output.className='container text-danger';
output.innerHTML=err.message;
});
Axios更具可讀性。Axios也非常受React和Vue等現代庫的歡迎。
jQuery
jQuery曾經是JavaScript中的一個前線庫,用于處理從AJAX調用到操縱DOM內容的所有事情。雖然隨著其他前端庫的“沖擊”,其相關性有所降低,但你仍然可以使用jQuery來進行異步調用。
如果你之前使用過jQuery,那么這可能是最簡單的解決方案。但是,你將不得不導入整個jQuery庫以使用$.ajax方法。雖然這個庫有特定于域的方法,例如$.getJSON,$.get和$.post,但是其語法并不像其他的AJAX庫那么簡單。以下代碼用于編寫基本的GET請求。
$.ajax({
url: '/users',
type: "GET",
dataType: "json",
success: function (data) {
console.log(data);
}
fail: function () {
console.log("Encountered an error")
}
});
jQuery好的地方在于,如果你有疑問,那么你可以找到大量的支持和文檔。我發現了很多使用FormData()和jQuery進行AJAX文件上傳的例子。下面是最簡單的方法:
var formData=new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
url : 'upload.php',
type : 'POST',
data : formData,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success : function(data) {
console.log(data);
alert(data);
}
});
SuperAgent
SuperAgent是一個輕量級和漸進式的AJAX庫,更側重于可讀性和靈活性。SuperAgent還擁有一個溫和的學習曲線,不像其他庫。它有一個針對Node.js API相同的模塊。SuperAgent有一個接受GET、POST、PUT、DELETE和HEAD等方法的請求對象。然后你可以調用.then(),.end()或新的.await()方法來處理響應。例如,以下代碼為使用SuperAgent的簡單GET請求。
request
.post('/api/pet')
.send({ name: 'Manny', species: 'cat' })
.set('X-API-Key', 'foobar')
.set('Accept', 'application/json')
.then(function(res) {
alert('yay got ' + JSON.stringify(res.body));
});
如果你想要做更多的事情,比如使用此AJAX庫上傳文件,那該怎么做呢? 同樣超級easy。
request
.post('/upload')
.field('user[name]', 'Tobi')
.field('user[email]', 'tobi@learnboost.com')
.field('friends[]', ['loki', 'jane'])
.attach('image', 'path/to/tobi.png')
.then(callback);
如果你有興趣了解更多關于SuperAgent的信息,那么它們有一系列很不錯的文檔來幫助你開始這個旅程。
Request——簡化的HTTP客戶端
Request庫是進行HTTP調用最簡單的方法之一。結構和語法與在Node.js中處理請求的方式非常相似。目前,該項目在GitHub上有18K個星,值得一提的是,它是可用的最流行的HTTP庫之一。 下面是一個例子:
var request=require('request');
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});
結論
從客戶端進行HTTP調用在十年前可不是一件容易的事。前端開發人員不得不依賴于難以使用和實現的XMLHttpRequest。現代的庫和HTTP客戶端使得用戶交互、動畫、異步文件上傳等前端功能變得更加簡單。
我個人最喜歡的是Axios,因為我覺得它更易讀更賞心悅目。你也可以忠于Fetch,因為它文檔化良好且有標準化的解決方案。
你個人最喜歡的AJAX庫是哪個? 歡迎各位分享你的看法。
在所有主流的網站,基本上都用到了ajax技術,通過異步請求數據已經是一個很普及的實現方式。市面上主流的web前端框架也都有自己封裝的ajax,而且都是大同小異的。也就是說,Ajax這個輪子已經是多的不能再多了,那為什么我們還要自己封裝一個Ajax呢?
想要了解一個技術或者某個功能的實現原理,只有動手實踐才能真正的了解。就如我在csdn上第一篇博客的博文描述。探索技術的路上本應該自己造輪子,即使市面上有再多的選擇,自己動手嘗試也是必要的,第一次嘗試必然會問題眾多,但你不覺得解決他是一件很有成就感的事情嗎,這樣才能帶給你更大的進步和更深刻的領悟。
廢話不說,先來寫一個最基礎的ajax:
[javascript] view plain copy
一個ajax出爐了,通過調用、填寫參數即可請求到服務器。先來分析一下這個ajax的結構,可以看得出來,其實很簡單,只是new了一個XMLHttpRequest對象,然后通過onreadystatechange方法來處理返回值,現在我們只是做了一個判斷,當請求成功時就調用success方法,如果請求失敗,我們還沒有寫上去,后面我們慢慢完善這個ajax的邏輯。
然后調用ajax的open方法,open方法里有三個參數,第一個是請求方式(如:get或post),第二個是請求的url地址,第三個是一個bool值,是否要異步請求。
最后使用send方法帶上參數發送請求即可。
這是,我的服務器已經收到一個請求,但他報了404錯誤,也就是找不到對應的頁面或路由,這時success方法也不會被調用執行。
那我們再來完善一下這個新生的ajax。我們只需要在onreadystatechange方法里增加一個條件,當請求不成功時調用自身的error方法:
[javascript] view plain copy
這樣我們就可以在ajax請求的時候加上error方法,當ajax請求失敗的時候執行我們想要執行的操作。現在我們拋除跨域請求的問題,當你發送post請求時,你會發現后臺接收不到傳過來的參數,調用如下:
[javascript] view plain copy
后端打印一下傳過來的參數,為空。
出現這個問題的原因主要是請求頭沒有聲明,這時候我們需要初始化聲明一下請求頭,那我們加入一行代碼:
[javascript] view plain copy
設置Conten-type為application/x-www-form-urlencoded,現在后端應該是已經可以收到參數了。那我們現在的ajax調用時實在太繁瑣,有些東西我們不想填的我們應該給他設置一個默認值,不然就會報錯。
比如error方法、method、還有是否異步的bool值等等。那我們再加入一些默認值,現在的ajax是這樣的:
[javascript] view plain copy
現在的ajax還存在一個問題,在post請求的時候,如果我們要傳參,是需要通過字符串傳參的。那這種的書寫規則并不是很友好的:
[javascript] view plain copy
而一般框架的傳參都是通過json的格式來輸入的,我們也不能偏離大眾習慣搞獨立,當然我們也要保留字符串的傳參方式,只是要擴展功能。
那我們需要加一個控制格式的參數,我們這里用dataType這個參數來控制傳參格式,默認是字符串格式傳參好了,可以選擇json格式進行傳參即可。如果是json格式傳參,我們需要把json轉化成字符串類型,代碼如下:
[javascript] view plain copy
這樣,我們的ajax也就可以通過json格式進行傳參了。現在的ajax完整代碼和調用方式如下:
[javascript] view plain copy
現在這個Ajax基本上已經可以滿足業務上的所以需求,不過還有一點沒有實現,我們的Ajax不能設置請求頭?!為了一些特殊需求的情況下,我們還是要把這一功能加上的:
[javascript] view plain copy
現在的完整代碼入下:
[javascript] view plain copy
完整示例代碼文件:JavaScript封裝Ajax完整示例代碼
1.導入jQuery包,可以選擇通過網絡地址進行導入 ,也可以下載jQuery的js文件進行導入,兩種方法如下。
jQuery的兩種引入方式
2.編寫我們的ajax異步方法。
前端代碼編寫
maven依賴添加
2.開始編寫我們的TestController代碼。
后臺代碼Controller編寫
3.接下來就是運行我們的程序,進入html或者jsp點擊按鈕即可看到效果,我這里就不做演示,大家如果還有什么問題的話隨時留言。
在數據庫中創建用戶表格
2.創建完成后,表結構如下圖所示:
用戶表結構
1.jdbc模式代碼如下:
jdbc模式代碼-1
jdbc模式代碼-2
2.mybatis模式如下:
Mybatis模式代碼
3.hibernate模式如下:
hibernate模式代碼
service通用代碼
Controller控制器代碼
html代碼,用戶注冊登陸頁面
至此,我們的驗證算是完成,大家如果還有什么問題,可以評論或者留言告訴我,我會盡全力為大家進行解答,謝謝各位。如果大家覺得有什么不便,可以私信聯系我。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。