视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ES6的Fetch异步请求的实现方法
2020-11-27 22:02:43 责编:小采
文档


在前端的快速发展中,为了契合更好的设计模式,产生了Fetch框架,Fetch返回的信息比XMLHttpRequest更丰富。但它目前还不是一个标准,它支持大部分常用的http 请求和响应的标准。

一. 一个完整的post请求和响应的过程

 var url = "/fetch";
 fetch(url,{
 method:"post",
 headers:{
 "Content-type":"application/x-www-form-urlencoded"
 },
 body:"name=luwenjing&age=22"
 })
 .then(function (response){
 if (response.status == 200){
 return response;
 }
 })
 .then(function (data) {
 return data.text();
 })
 .then(function(text){
 console.log("请求成功,响应数据为:",text);
 })
 .catch(function(err){
 console.log("Fetch错误:"+err);
 });

(1)fetch的参数有两个,第一个是url即请求的处理路径;

第二个是初始化信息,包括以下几种:

  • method:请求方法,常用的有get和post;
  • headers:请求头信息,最常用的就是表单格式的数据:”Content-type”:”application/x-www-form-urlencoded”;
  • mode:控制是否允许跨域。same-origin(同源请求)、no-cors(默认)和cros(允许跨域请求);
  • cache:关于缓存的一些设置;
  • body:要发送到后台的参数,可以为ArrayBuffer,String,FormData等类型;
  • (2)从上面的代码我们可以知道fetch()方法返回的是一个promise对象;

    (3)响应信息为传入then方法成功时的参数,相应包含很多http的响应信息,如下:

    (4)可以判断响应的状态吗,返回请求成功的对应信息;

    (5)通过状态转换,转换为指定的格式,如果是文本信息,直接text()方法就可以;若为json格式,则json()就可以转换为json格式信息,其实也就是自己请求数据格式时所设置的格式;

    二. 后台处理代码:

    import java.io.IOException;
    import java.io.Writer;
    
    /**
     * Created by LuWenjing on 2017/4/5.
     */
    public class fetchServlet extends javax.servlet.http.HttpServlet {
     protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
     String name = request.getParameter("name");
     String age = request.getParameter("age");
     System.out.println(name + ": " + age);
     Writer out = response.getWriter();
     out.write("hello world!");
     }
    
     protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
     doPost(request, response);
     }
    }

    后台成功输出:

    浏览器控制台成功打印:

    三. 和ajax 的对比

    (1)上面的Fetch代码很像jQuery中的ajax,但是两者是不同的,fetch是原生的js,而jQuery中的ajax是库封装的;

    (2)ajax只能实现同源请求,fetch可实现跨域请求;

    (3)ajax几乎所有的主流浏览器都支持,但fetch由于目前并没有被列入标准,只有像firefox最新版,chrome最新版,以及IE10+等以上才支持,如下图片所示;

    注意:在body中向后台传递参数时,只有写成“key=value&key=value”的形式才会成功,其它方法后台接收到均为null,封装为FormData格式也不成功。

    下载本文
    显示全文
    专题