Request对象

Request对象用来构造 HTTP 请求。

  1. var req = new Request('/index.html');
  2. req.method // "GET"
  3. req.url // "http://example.com/index.html"

Request对象的第二个参数,表示配置对象。

  1. var uploadReq = new Request('/uploadImage', {
  2. method: 'POST',
  3. headers: {
  4. 'Content-Type': 'image/png',
  5. },
  6. body: 'image data'
  7. });

上面代码指定Request对象使用 POST 方法发出,并指定 HTTP 头信息和信息体。

下面是另一个例子。

  1. var req = new Request(URL, {method: 'GET', cache: 'reload'});
  2. fetch(req).then(function(response) {
  3. return response.json();
  4. }).then(function(json) {
  5. someOperator(json);
  6. });

上面代码中,指定请求方法为 GET,并且要求浏览器不得缓存 response。

Request对象实例有两个属性是只读的,不能手动设置。一个是referrer属性,表示请求的来源,由浏览器设置,有可能是空字符串。另一个是context属性,表示请求发出的上下文,如果值是image,表示是从<img>标签发出,如果值是worker,表示是从worker脚本发出,如果是fetch,表示是从fetch函数发出的。

Request对象实例的mode属性,用来设置是否跨域,合法的值有以下三种:same-origin、no-cors(默认值)、cors。当设置为same-origin时,只能向同域的 URL 发出请求,否则会报错。

  1. var arbitraryUrl = document.getElementById("url-input").value;
  2. fetch(arbitraryUrl, { mode: "same-origin" }).then(function(res) {
  3. console.log("Response succeeded?", res.ok);
  4. }, function(e) {
  5. console.log("Please enter a same-origin URL!");
  6. });

上面代码中,如果用户输入的URL不是同域的,将会报错,否则就会发出请求。

如果mode属性为no-cors,就与默认的浏览器行为没有不同,类似<script>标签加载外部脚本文件、<img>标签加载外部图片。如果mode属性为cors,就可以向部署了CORS机制的服务器,发出跨域请求。

  1. var u = new URLSearchParams();
  2. u.append('method', 'flickr.interestingness.getList');
  3. u.append('api_key', '<insert api key here>');
  4. u.append('format', 'json');
  5. u.append('nojsoncallback', '1');
  6. var apiCall = fetch('https://api.flickr.com/services/rest?' + u);
  7. apiCall.then(function(response) {
  8. return response.json().then(function(json) {
  9. // photo is a list of photos.
  10. return json.photos.photo;
  11. });
  12. }).then(function(photos) {
  13. photos.forEach(function(photo) {
  14. console.log(photo.title);
  15. });
  16. });

上面代码是向 Flickr API 发出图片请求的例子。

Request对象的一个很有用的功能,是在其他Request实例的基础上,生成新的Request实例。

  1. var postReq = new Request(req, {method: 'POST'});