request 请求比较
Node.js request 请求比较
Categories:
XMLHttpRequest
最基本最原生的JS请求方法,今天有多个请求,并且有先后关係,就会出现一个 callback hell 的状况,所以才衍生出 jQuery 的 Ajax 封装。
// 要使用,要先new一个XHR的物件
var request = new XMLHttpRequest()
// 然后定义连线方式(get / post ...)
request.open('get',"http://www.example.org/example.txt")
// 发送请求
request.send()
// 如果成功就doSuccessFunc()
request.onload = doSuccessFunc
// 如果失败就doFalseFunc()
request.onerror = reqError;
jQuery
$.ajax({
methods:'get',
url:'https://www.example.org/example.txt',
dataType:'json', //xml, html, script, json, jsonp, text
success: function(data){
console.log(data)
},
})
在现代前端框架的兴起下,jQuery逐渐式微,式微原因有
- 本身是对 MVC 的编成,不符合现在前端 MVVM 的浪潮
- 基于原生的 XH R开发,XHR 本身的架构不清晰,现在已经有了
fetch
的替代方案。 - jQuery 的整个项目太大,单纯使用 ajax 却要引入整个 jQuery 不合理
- 不符合关注点分离原则
- 配置与调用方式混乱,而且基于事件的异步模型不友好
Fetch
- 当接收到一个代表错误的HTTP状态码时,从 fetch() 返回的 Promise
不会
被标记为 reject(即使响应状态是404 or 500),fetch会将这两种状态标记为 resolve(但是会将resolve返回的值设定为false),只有当网路故障 or 请求被阻止
时,才会标记为reject - 默认情况下,fetch 不会从服务端发送或接收任何 cookies,如果站点依赖于用户的 session,则会导致未经认证的请求(要发送cookies,必须设置credentials选项)
fetch('http://example.com/movies.json')
.then(function(res){ //一样有then
console.log(res)
})
.catch(function(error){
console.log(error)
})
fetch 参数
// fetch 可以接受第二个可选参数,一个可以控制不同配置的init物件
postFunc('http://example.com/movies.json',{ans:52})
.then(function(res){ //一样有then
console.log(res)
})
.catch(function(error){
console.log(error)
})
function postFunc(url,data){
return fetch(url,{
body:JSON.stringify(data),
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, same-origin, *omit
header:{
'user-agent':'Mozilla/4.0 MDN Exam',
'content-type':'application/json'
},
method:'POST', // GET/POST/PUT/DELETE
mode: 'cors', // no-cors, cors, * same-origin
redirect: 'follow', // manual, *follow, error
referrer: 'no-referrer' // *client, no-referrer
})
.then(res => res.json())
}
fetch 优点
- 语法简洁,更加语意化
- 基于标准Promise实现,支持async / await
- 更加底层,提供API丰富
- 脱离XHR,并且是ES规范的实现方式。 并且fetch在前端的应用上有一项强于XHR的能力:跨域处理
Axios
Axios 本质上是对XHR的封装,只不过他是 Promise 的实现版本,可以用在浏览器和 node.js 中,符合最新的 ES 规范
// 为ID的user创建请求,Demo1
axios.get('/user?ID=12345') // 也可将get 改为 post
.then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
// 为ID的user创建请求,Demo2
axios.get('/user',{ // 也可将get 改为 post
params:{
ID:12345
}
}).then(function(res){
console.log(res)
}).catch(function(err){
console.log(err)
})
Axios 併发请求
function getUserAcoount(){
return axios.get('/user/12345')
}
function getUsePromise(){
return axios.get('/user/12345/permission')
}
// 如同 Promise使用All,然后也是传入阵列
axios.all([getUserAcoount(),getUsePromise()])
.then(axios.spread(function(acct,perms){
console.log(acct)
}))
Axios 优点
- 从浏览器创建XMLHttpRequests
- 从node.js 创建 http请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御 XSRF(原理是将你的每个请求都带一个从Cookie拿到的key,并且根据同源政策,假冒的网站无法拿到你cookie的key,因此后台即可判断)