• Fetch API


    Ajax 的 API -> fetch():

    一起学习吧:http://javascript.ruanyifeng.com/bom/ajax.html#toc27

    fetch操作返回Promise对象,babel可以编译,一些高版本浏览器支持。

    fetch(url).then(function (response) {
      return response.json();
    }).then(function (jsonData) {
      console.log(jsonData);
    }).catch(function () {
      console.log('出错了');
    });

    对比XHR写法

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.responseType = 'json';
    xhr.onload = function() {
      console.log(xhr.response);
    };
    xhr.onerror = function() {
      console.log('出错了');
    };
    xhr.send();

    Fetch API提供以下五个数据流读取器:

    response.text():返回字符串。

    response.json():返回一个JSON对象。

    response.formData():返回一个FormData对象。

    response.blob():返回一个对象。

    response.arrayBuffer():返回一个二进制数组。

    数据流只能读取一次,一旦读取,数据流变空,再次读取会报错。

    可以使用response.clone()复制一个副本。

    var progress = 0;
    var contentLength = 0;
    
    var getStream = function (reader) {
      return reader.read().then(function (result) {
        // 如果数据已经读取完毕,直接返回
        if (result.done) {
          return;
        }
    
        // 取出本段数据(二进制格式)
        var chunk = result.value;
    
        var text = '';
        // 假定数据是UTF-8编码,前三字节是数据头,
        // 而且每个字符占据一个字节(即都为英文字符)
        for (var i = 3; i < chunk.byteLength; i++) {
          text += String.fromCharCode(chunk[i]);
        }
    
        // 将本段数据追加到网页之中
        document.getElementById('content').innerHTML += text;
    
        // 计算当前进度
        progress += chunk.byteLength;
        console.log(((progress / contentLength) * 100) + '%');
    
        // 递归处理下一段数据
        return getStream(reader);
      };
    };

    fetch():

    第一个参数:可以是url也可以是Request对象实例。Fetch函数返回一个Promise对象,并将一个response对象传给回调函数。

    第二个参数:是一个option对象,用于配置请求方式,发不发送数据给服务器,采不采用跨域方式:

    1、mode:值有,basic正常同域请求,cors在CORS机制下跨域请求,opaque非CORS机制下跨域请求。

    2、credentials:是否将cookie发送到服务器端,发送"include"

    3、mothod:"POST" "GET"

    4、headers:{"Cache-Control":"publice,24*60*60,"}

    5、body:要传到后台的数据,可以接受blob、formData、字符串(key1=value1&key2=value2) 包括图片和文件

    Fetch API 引入三个新对象 Headers Request Response 也是构造函数 new Headers() new Request() new Response()

    使用方法和FormData对象很像

    var content = 'Hello World';
    var headers = new Headers();
    headers.append("Accept", "application/json");
    headers.append("Content-Type", "text/plain");
    headers.append("Content-Length", content.length.toString());
    headers.append("X-Custom-Header", "ProcessThisImmediately");
    reqHeaders = new Headers({
      "Content-Type": "text/plain",
      "Content-Length": content.length.toString(),
      "X-Custom-Header": "ProcessThisImmediately",
    });
    reqHeaders.has("Content-Type") // true
    reqHeaders.has("Set-Cookie") // false
    reqHeaders.set("Content-Type", "text/html")
    reqHeaders.append("X-Custom-Header", "AnotherValue")
    
    reqHeaders.get("Content-Length") // 11
    reqHeaders.getAll("X-Custom-Header") // ["ProcessThisImmediately", "AnotherValue"]
    
    reqHeaders.delete("X-Custom-Header")
    reqHeaders.getAll("X-Custom-Header") // []

    Headers 可以配合 Request 或者 Response

    var headers = new Headers({
      'Content-Type': 'application/json',
      'Cache-Control': 'max-age=3600'
    });
    
    var response = new Response(
      JSON.stringify({photos: {photo: []}}),
      {'status': 200, headers: headers}
    );
    
    response.json().then(function(json) {
      insertPhotos(json);
    });
    var headers = new Headers();
    headers.append('Accept', 'application/json');
    var request = new Request(URL, {headers: headers});
    
    fetch(request).then(function(response) {
      console.log(response.headers);
    });

    Request对象:Request对象用来构造HTTP请求

    var uploadReq = new Request("/uploadImage", {
      method: "POST",
      headers: {
        "Content-Type": "image/png",
      },
      body: "image data"
    });
    var req = new Request("/index.html");
    req.method // "GET"
    req.url // "http://example.com/index.html"
    var req = new Request(URL, {method: 'GET', cache: 'reload'});
    fetch(req).then(function(response) {
      return response.json();
    }).then(function(json) {
      someOperator(json);
    });

    fetch方法返回Response对象实例,它有以下属性。

    • status:整数值,表示状态码(比如200)
    • statusText:字符串,表示状态信息,默认是“OK”
    • ok:布尔值,表示状态码是否在200-299的范围内
    • headers:Headers对象,表示HTTP回应的头信息
    • url:字符串,表示HTTP请求的网址
    • type:字符串,合法的值有五个basic、cors、default、error、opaque。basic表示正常的同域请求;cors表示CORS机制的跨域请求;error表示网络出错,无法取得信息,status属性为0,headers属性为空,并且导致fetch函数返回Promise对象被拒绝;opaque表示非CORS机制的跨域请求,受到严格限制。
      • Response.error() 返回一个type属性为error的Response对象实例
      • Response.redirect(url, status) 返回的Response对象实例会重定向到另一个URL
      • fetch("https://example.com", init)
        .then(function (response) {
        // Check that the response is a 200
          if (response.status === 200) {
            alert("Content type: " + response.headers.get('Content-Type'));
          }
        });

        Request对象和Response对象都有body属性,表示请求的内容。body属性可能是以下的数据类型:

        • ArrayBuffer
        • ArrayBufferView (Uint8Array等)
        • Blob/File
        • string
        • URLSearchParams
        • FormData
        • Request对象和Response对象都提供以下方法,用来读取body。
          • arrayBuffer()
          • blob()
          • json()
          • text()
          • formData()
          • Request对象和Response对象都有bodyUsed属性,返回一个布尔值,表示body是否被读取过
  • 相关阅读:
    Dockerfile中ENTRYPOINT 和 CMD的区别
    Dockerfile的书写规则和指令的使用方法
    docker+ bind mount 部署复杂flask应用
    VUE验证器哪家强? VeeValidate absolutely!
    DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配
    那些NPM文档中我看不懂地方
    “随机数”函数的 ES6 实现
    django-filter version 2.0 改动
    msgbox用法
    html01. <!DOCTYPE html>
  • 原文地址:https://www.cnblogs.com/lantuoxie/p/6954067.html
Copyright © 2020-2023  润新知