Request对象
Request
对象用来构造 HTTP 请求。
var req = new Request('/index.html');
req.method // "GET"
req.url // "http://example.com/index.html"
Request
对象的第二个参数,表示配置对象。
var uploadReq = new Request('/uploadImage', {
method: 'POST',
headers: {
'Content-Type': 'image/png',
},
body: 'image data'
});
上面代码指定Request
对象使用 POST 方法发出,并指定 HTTP 头信息和信息体。
下面是另一个例子。
var req = new Request(URL, {method: 'GET', cache: 'reload'});
fetch(req).then(function(response) {
return response.json();
}).then(function(json) {
someOperator(json);
});
上面代码中,指定请求方法为 GET,并且要求浏览器不得缓存 response。
Request
对象实例有两个属性是只读的,不能手动设置。一个是referrer
属性,表示请求的来源,由浏览器设置,有可能是空字符串。另一个是context
属性,表示请求发出的上下文,如果值是image
,表示是从<img>
标签发出,如果值是worker
,表示是从worker
脚本发出,如果是fetch
,表示是从fetch
函数发出的。
Request
对象实例的mode
属性,用来设置是否跨域,合法的值有以下三种:same-origin、no-cors(默认值)、cors。当设置为same-origin
时,只能向同域的 URL 发出请求,否则会报错。
var arbitraryUrl = document.getElementById("url-input").value;
fetch(arbitraryUrl, { mode: "same-origin" }).then(function(res) {
console.log("Response succeeded?", res.ok);
}, function(e) {
console.log("Please enter a same-origin URL!");
});
上面代码中,如果用户输入的URL不是同域的,将会报错,否则就会发出请求。
如果mode
属性为no-cors
,就与默认的浏览器行为没有不同,类似<script>
标签加载外部脚本文件、<img>
标签加载外部图片。如果mode
属性为cors
,就可以向部署了CORS
机制的服务器,发出跨域请求。
var u = new URLSearchParams();
u.append('method', 'flickr.interestingness.getList');
u.append('api_key', '<insert api key here>');
u.append('format', 'json');
u.append('nojsoncallback', '1');
var apiCall = fetch('https://api.flickr.com/services/rest?' + u);
apiCall.then(function(response) {
return response.json().then(function(json) {
// photo is a list of photos.
return json.photos.photo;
});
}).then(function(photos) {
photos.forEach(function(photo) {
console.log(photo.title);
});
});
上面代码是向 Flickr API 发出图片请求的例子。
Request
对象的一个很有用的功能,是在其他Request
实例的基础上,生成新的Request
实例。
var postReq = new Request(req, {method: 'POST'});