本文介绍了5个顶级的JavaScript AJAX组件库,包括Fetch API、Axios、jQuery、SuperAgent和Request。详细解析了各库的特性、使用场景及代码示例,帮助开发者根据项目需求选择最合适的异步通信方案。
AJAX(Asynchronous JavaScript and XML)是一组用于在客户端与服务器之间进行异步HTTP调用的Web开发技术。作为Web开发领域的经典概念,许多流行的JavaScript小部件都基于AJAX构建。例如,特定的用户交互(如点击按钮)可以异步触发服务器请求,服务器检索数据后返回给客户端,整个过程无需重新加载整个网页。
AJAX的现代化重新引入
随着JavaScript的演进,现代动态网站多采用React、Angular、Vue等前端库或框架构建。AJAX的概念也随之发生巨大变化,现代异步JavaScript调用主要涉及检索JSON而非XML。目前有许多库允许客户端应用程序向服务器发起异步调用,其中一些已纳入浏览器标准,另一些则凭借灵活性和易用性拥有庞大的用户基础。这些库有的支持Promise,有的使用回调函数。本文将介绍5个用于从服务器获取数据的AJAX库。
Fetch API
Fetch API是XMLHttpRequest的现代替代品,用于从服务器检索资源。与XMLHttpRequest相比,Fetch拥有更强大的功能集和更具语义化的命名。基于其语法和结构,Fetch既灵活又易于使用。与其他AJAX HTTP库不同,Fetch得到了所有现代Web浏览器的原生支持。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的其他突出特点包括:
拦截请求和响应。
使用promise转换请求和响应数据。
自动转换JSON数据。
取消实时请求。
要使用Axios,你需要先安装它。
npm install axios
下面是一个演示Axios行动的基本例子。
// Make a request for a user with a given IDaxios.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.
});
个人最喜欢的是Axios,因为它更易读更赏心悦目。你也可以忠于Fetch,因为它文档化良好且有标准化的解决方案。
当然还有其它一些不错的Ajax组件库,在以后的文章中我们会继续为大家分享