fetch API

访客3年前黑客资讯880

fetch

  • 一个获取资源的接口,类似于ajax
  • 是基于 Promise之上设计,旧版本IE 完全不支持,须借助 polyfill来兼容
  • 提供了对 Request 和 Response (以及其他与 *** 请求有关的)工具的通用界说
  • 发送请求或者获取资源,需要使用 window.fetch or WindowOrWorkerGlobalScope.fetch 方式。


参数

资源路径(url string)

  • 他必须吸收一个需要请求的资源路径,返回一个promise工具,请求乐成的数据返回到Responese回调中,请求失败的信息返回到 Request中。
  • 当吸收到一个代表错误的 HTTP状态码时,fetch返回的promise不会被标记为 reject而会被标记为resolve,好比状态码为 404,500.只有 *** 故障或请求被阻止时才被标记为reject
fetch('https://api.apiopen.top/musicDetails1')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson); //{code: 400, message: "404 Not Found", result: "https://api.apiopen.top/musicDetails1"}
  })

fetch 默认是不会从服务端发送吸收或发送任何 cookie,若是需要则必须设置 credentials,自 2017/8 起默认的credentials政策变更为same-originFirefox也在61.0b13中改变默认值

[config]

设置项工具,包罗所有对请求的设置

1.method: 请求使用的方式,如 GET、POST。

2.headers: 请求的头信息,形式为 Headers 的工具或包罗 ByteString值的工具字面量。

3.body:请求的 body信息可能是:

  1. Blob( 示意一个不可变、原始数据的类文件工具)、
    BufferSource ( 用于示意自身为ArrayBuffer或者TypedArray提供工具的工具ArrayBufferView。)、
    FormData(示意表单数据的键值对的组织方式,经由它的数据可以使用XMLHttpRequest.send() 方式送出,本接口和此方式都相当简朴直接。若是送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的花样。)、
    URLSearchParams (接口界说了一些适用的方式来处置 URL 的查询字符串)或者 USVString 工具。
    注重GET 或HEAD方式的请求不能包罗 body 信息。

4.mode: 请求的模式,如 cors、 no-cors 或者 same-origin。

5.credentials: 请求的 credentials,如 omit、same-origin 或者 include。为了在当前域名内自动发送 cookie , 必须提供这个选项, 从 Chrome 50 更先, 这个属性也可以接受 FederatedCredential 实例或是一个PasswordCredential 实例。

  1. 若是需要跨域请求需设置为 "include"
    若是只在同域内发送cookie 则设置为 "same-origin"
    若是任何情形都不发送cookie 则设置为 "omit"

6.cache: 请求的 cache 模式: default 、 no-store 、 reload 、 no-cache 、 force-cache 或者 only-if-cached 。

7.redirect: 可用的redirect 模式:follow(自动重定向), error (若是发生重定向将自动终止而且抛出一个错误), 或者manual (手动处置重定向). 在Chrome中,Chrome 47之前的默认值是 follow,从 Chrome 47更先是manual。

8.referrer: 一个USVString 可以是 no-referrer、client或一个URL。默认是client。

9.referrerPolicy:指定引用HTTP头的值。可能是一个 no-referrer、 no-referrer-when-downgrade、 origin、 origin-when-cross-origin、 unsafe-url 。

10.integrity: 包罗请求的subresource integrity值 例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。

const Fetch = function (url,config){
   if(typeof(config) !== 'object' || config === null) return throw `Config needs to pass an object type`
  let data = config || {} ;
  let {method = 'GET', param = null, mode = "cors", cache = "no-cache",headers = {'Access-Control-Allow-Origin': '*',
    'content-type': 'application/json'}, redirect = "follow", credentials = "include", referrer = "no-referrer"} = data;
  /*  // 传输  *** ON 数据 需将 param 转换 
     *** ON.stringify(param)
    //上传文件 需传输 formData 花样
    let formData = new FormData()
    let fileField = document.querySelector("#myFile")
    formData.append('title',"My File")
    formData.append('fileField ',fileField .files[0])
    
  */

  return  fetch(url,{
   method:method.toUpperCase(),
   body:param,
   mode,
   cache,
   headers,
   redirect,
   credentials,
}).then(res =>{
   if(res.ok) return res.json() 
    throw new Error("Network response fail:"+res.status)
}
).catch(err=>console.error(err))
}

Fetch('https://api.apiopen.top/musicDetails1',{credentials:'omit'}).then(res =>console.log(res)).catch(err=>console.error(err))


Headers constructor

建立一个 headers 工具,一个 headers 工具是一个简朴的多名值对:

let content = "Hello World";
let myHeaders = new Headers();
myHeaders.append("Content-Type", "text/plain");
myHeaders.append("Content-Length", content.length.toString());
myHeaders.append("X-Custom-Header", "ProcessThisImmediately");


可以传一个多维数组或者工具字面量:

let content = "Hello World";
let myHeaders = new Headers({
  "Content-Type": "text/plain",
  "Content-Length": content.length.toString(),
  "X-Custom-Header": "ProcessThisImmediately",
});

//获取和设置
console.log(myHeaders.has("Content-Type")); // true
console.log(myHeaders.has("Set-Cookie")); // false
myHeaders.set("Content-Type", "text/html");
myHeaders.append("X-Custom-Header", "AnotherValue");
 
console.log(myHeaders.get("Content-Length")); // 11
console.log(myHeaders.getAll("X-Custom-Header")); // ["ProcessThisImmediately", "AnotherValue"]
 
myHeaders.delete("X-Custom-Header");
console.log(myHeaders.getAll("X-Custom-Header")); // [ ]

若是使用了一个不合法的HTTP Header属性名,那么Headers的方式通常都抛出 TypeError 异常。若是不小心写入了一个不可写的属性,也会抛出一个 TypeError 异常。除此以外的情形,失败了并不抛出异常。


检查 content type 是否准确

fetch(myRequest).then(function(response) {
  if(response.headers.get("content-type") === "application/json") {
    return response.json().then(function(json) {
      // process your  *** ON further
    });
  } else {
    console.log("Oops, we haven't got  *** ON!");
  }
});


Response 工具

  • fetch 返回的工具


工具中常用的属性

  1. status: 响应状态码 如 200 404 等
  2. statusText:返回和状态码对应信息
  3. ok 检查状态码是否 在 200-299之间,返回true or false


检查环境支持度

if(this.fetch) {
    // run my fetch request here
} else {
    // do something with XMLHttpRequest?
}


兼容性


思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

有黑客能帮忙找微博密码吗(网上钱被骗找黑客帮忙)

别信那些我刚被骗,所谓的黑客能查各种信息都是骗人的 最后提醒大家的一点:就是千万不要相信有人和你说他也被骗过他之前找谁谁谁帮忙追回来的然后介绍给你让你去找千万不要上当, 及时报警。国家已经出台政策了,...

偷偷查我老婆陌陌已删聊天记录

市面上有许多五花八门的增高产品,不仅不能帮助孩子增高,甚至会让孩子性早熟,家长要切记不要随意给孩子吃增高药,应选择恰当的方式帮助孩子长高,那么,给孩子吃增高药有什么副作用?接下来友谊长存小编来说说。...

公安手机数据采集系统

应该是将你的手机SIM卡放在读卡器中插入电脑主机中复制你的手机卡信息。手机卡中的:储存短信、通讯记录、通讯录等资料都被复制。这是一种严重的侵权行为。 办身份证不采集DNA,采集指纹有专门的扫描仪,其他...

SMG是林俊杰创立的品牌吗 SMG是什么档次的牌子

许多大牌明星都开创了归属于自身的时尚潮流品牌服装一些设计方案度和品质层面都挺好的。SMG是熟识时尚潮流社交圈里边很多人都了解的一款,是歌星周杰伦开创的配搭穿衣搭配样式還是都非常好的。SMG是周杰伦开创...

示例cr2格式怎么打开

示例cr2格式怎么打开

cr2格式也就是大家应用的佳能eos照相机的RAW格式文档的储存扩展名,有一些沒有应用过佳能相机的客户很有可能不清楚cr2格式如何打开,别担心,下边我就来告诉你cr2格式如何打开。我从事早已很多年了,...

总是失眠怎么办?四个方法都试试,缓解绝对有

总是失眠怎么办?四个方法都试试,缓解绝对有

失眠,大家并不陌生,不少人深受其害。它可引起人的疲劳感、不安、全身不适、无精打采、反应迟缓、头痛、记忆力不集中等症状,最大影响是精神方面的,严重一点会导致精神分裂。那么,有什么方法让自己睡着?下面介绍...