1, 简介  

  fetch方法是 Fetch API的一个方法,提供了一种简单、合理的方式来跨网络异步获取资源。

  与原来的XMLHttpRequest比较,fetch更容易与其他的技术结合:比如service workers。还提供了单个逻辑位置来定义其他HTTP相关概念,例如CORS和HTTP的扩展。

  默认情况下fetch不会从服务端接收或发送cookies,如果需要发送则设置credentials选项(默认的credentials为same-origin)。

2,参数

  fetch(url, init={})

     url: 为请求的url路径,  也可以是Request对象(new Request( '请求路径'));

     init: 配置对象,可选的参数有

      • credentials:  能否发送带凭据的请求;  参数为omit、same-origin 或者include
      • headers:请求头, 可以使用对象字面量,也可以使用Headers()构造函数创建一个headers对象。
      • method: 请求方法, get post put delete option等。。
      • cros: 请求是否允许跨域,   参数为 cors、no-cors或same-origin;
      • cache:请求的cache模式, 参数为 default、no-store、reload、no-cache、force-cache或only-if-cached。
      • body:请求主体。 get和head方法不包含body。body可以是以下类型的实例(ArrayBuffer、ArrayBufferView、Blob/File、string、URLSearchParams、FormData), body类包含了以下的方法,可以返回解析后的promise对象和数据(arrayBuffer()、blob() , json() , text() , formData());
      • 等等.....

3,fetch的封装

async function fetch(url, data = {}, method = 'get', way = 'fetch') {
method = method.toUpperCase();
if (method === 'GET') {
let str = '';
Object.keys(data).forEach(item => {
str += `${item}=${data[item]}&`;
});
if (str) {
url = url + '?' + str.slice(0, -1);
}
} if (window.fetch && way === 'fetch') {
let reqInit = {
credentials: 'inclued',
method,
headers: {
'Accept':'application/json',
'Content-Type': 'application/json'
},
mode: 'cors',
cache: 'force-cache'
};
if (method === 'POST') {
Object.assign(reqInit, {
body: JSON.stringify(data)
})
}
try {
const res = await fetch(url, reqInit);
const resJson = res.json();
return resJson;
} catch(e) {
Promise.reject(e);
}
} else {
return new Promise((resolve, reject) => {
let httpReqObj;
if (window.XMLHttpRequest) {
httpReqObj = new XMLHttpRequest();
} else {
httpReqObj = new ActiveXObject('Microsoft.XMLHTTP');
} httpReqObj.open(method, url, true);
httpReqObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReqObj.send(method === 'POST' ? JSON.stringify(data) : null);
httpReqObj.onreadystatechange = () => {
if (httpReqObj.readyState === 4){
if (httpReqObj.status === 200) {
let obj = httpReqObj.response;
if (typeof obj !== 'object') {
obj = JSON.parse(obj);
}
resolve(obj);
} else {
reject(httpReqObj);
}
}
}
})
}
}

  如果不支持fetch或者你不想用fetch, 就改为用xmlhttprequest来发送, 里面的很多参数我都是根据自己项目的需求写死了, 想写的更灵活的小伙伴们可以自行的再封装。

  

  

封装 原生 fetch的更多相关文章

  1. 兼容各版本浏览器,封装原生Js获取ClassName

    web前端开发工作中常常会用到获取元素的className,用jQuery的$(".class")方法也可以获取className,但是有时候牵扯到数据而影响的加载顺序的原因会获取 ...

  2. js 封装原生ajax

    jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只需要ajax,这时引入jquery库会造成资源浪费,也会显得页面臃肿.这时我们就 ...

  3. 结合promise对原生fetch的两个then用法理解

    前言:该问题是由于看到fetch的then方法的使用,产生的疑问,在深入了解并记录对promise的个人理解 首先看一下fetch请求使用案例: 案例效果:点击页面按钮,请求当前目录下的arr.txt ...

  4. php 封装原生数据导入的方法(csv文件格式)

    //前端---部分代码 <form class="form-inline" style="margin-top: 20px" method="p ...

  5. 【转】封装原生JS实现Ajax

    function createXHR() { if (window.XMLHttpRequest) { //IE7+.Firefox.Opera.Chrome 和Safari return new X ...

  6. javascript - 封装原生js实现ajax

    1 /* * ajax方法 */ var Ajax = function() { var that = this; //创建异步请求对象方法 that.createXHR = function() { ...

  7. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  8. vue实践---vue结合 promise 封装原生ajax

    有时候不想使用axios这样的外部依赖,想自己封装ajax,这里有两种方法 方法一,在单个页面内使用 封装的代码如下: beforeCreate () { this.$http = (() => ...

  9. 原生ajax解析&封装原生ajax函数

    前沿:对于此篇随笔,完是简要写了几个重要的地方,具体实现细节完在提供的源码做了笔记 <一>ajax基本要点介绍--更好的介绍ajax 1. ajax对象中new XMLHttpReques ...

随机推荐

  1. 利用BeanUtils.copyProperties 克隆出新对象,避免对象重复问题

    1.经常用jQuery获取标签里面值val(),或者html(),text()等等,有次想把获取标签的全部html元素包括自己也用来操作,查询了半天发现$("#lefttr1"). ...

  2. Access denied for user 'root'@'MiWiFi-Ryyy-srv' (using password: YES)

    虽然是跟很多人一样的问题但是原因不同,其他很多文章说是授权问题,也确实是授权问题,但是,配置文件写的是连接localhost,而这里不知道什么原因切换了使用的用户,变成了默认访问MiWiFi-Ryyy ...

  3. CodeForces 688B Lovely Palindromes (水题回文)

    题意:给一个数n,让你找出长度为偶数,并且是第 n 个回文数. 析:你多写几个就知道了,其实就是 n,然后再加上n的逆序,不过n有点大,直接用string 好了. 代码如下: #include < ...

  4. eclipse 在线安装 properties 插件

    help - install new software - work with site http://propedit.sourceforge.jp/eclipse/updates/ 要耐心等待

  5. 常见gcc编译问题解决方法集

    除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词):用"-Wl,-Bstatic"指定链接静态库,使用 ...

  6. C++智能指针shared_ptr

    shared_ptr 这里有一个你在标准库中找不到的—引用数智能指针.大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章.最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引 ...

  7. [转载]关于JAVA中子类和父类的构造方法

    原文链接:https://www.cnblogs.com/chenpi/p/5486096.html#_label0

  8. Oracle EBS Color 色彩设置

    Oracle EBS配色方案的截图 If the Java Look and Feel profile option is set to Oracle, the Java Color Scheme c ...

  9. Android-ImageUtils工具类

    图片相关的工具类 public class ImageUtils { public static boolean saveImage(Bitmap photo, String spath) { try ...

  10. Centos 下部署tomcat多实例

    基础环境及JDK就不多说了,下面的目录结构以如下为准: 根目录-apps 根目录-apps--tomcat 根目录-apps--ins1 根目录-apps--ins2 ================ ...