fetch()
fetch
方法的第一个参数可以是 URL 字符串,也可以是后文要讲到的Request
对象实例。Fetch
方法返回一个Promise
对象,并将一个response
对象传给回调函数。
response
对象有一个ok
属性,如果返回的状态码在200到299之间(即请求成功),这个属性为true
,否则为false
。因此,判断请求是否成功的代码可以写成下面这样。
fetch('./api/some.json').then(function (response) {
if (response.ok) {
response.json().then(function (data) {
console.log(data);
});
} else {
console.log('请求失败,状态码为', response.status);
}
}, function(err) {
console.log('出错:', err);
});
response
对象除了json
方法,还包含了服务器 HTTP 回应的元数据。
fetch('users.json').then(function(response) {
console.log(response.headers.get('Content-Type'));
console.log(response.headers.get('Date'));
console.log(response.status);
console.log(response.statusText);
console.log(response.type);
console.log(response.url);
});
上面代码中,response
对象有很多属性,其中的response.type
属性比较特别,表示HTTP回应的类型,它有以下三个值。
- basic:正常的同域请求
- cors:CORS 机制下的跨域请求
- opaque:非 CORS 机制下的跨域请求,这时无法读取返回的数据,也无法判断是否请求成功
如果需要在 CORS 机制下发出跨域请求,需要指明状态。
fetch('http://some-site.com/cors-enabled/some.json', {mode: 'cors'})
.then(function(response) {
return response.text();
})
.then(function(text) {
console.log('Request successful', text);
})
.catch(function(error) {
log('Request failed', error)
});
除了指定模式,fetch 方法的第二个参数还可以用来配置其他值,比如指定 cookie 连同 HTTP 请求一起发出。
fetch(url, {
credentials: 'include'
})
发出 POST 请求的写法如下。
fetch('http://www.example.org/submit.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'firstName=Nikhil&favColor=blue&password=easytoguess'
}).then(function(res) {
if (res.ok) {
console.log('Perfect! Your settings are saved.');
} else if (res.status == 401) {
console.log('Oops! You are not authorized.');
}
}, function(e) {
console.log('Error submitting form!');
});