博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 fetch 封装网络请求,返回promise 对象
阅读量:7217 次
发布时间:2019-06-29

本文共 3530 字,大约阅读时间需要 11 分钟。

1.fetch 的概念和用法

fetch 提供了对  和  (以及其他与网络请求有关的)对象的通用定义。使之今后可以被使用到更多地应用场景中:无论是service workers、Cache API、又或者是其他处理请求和响应的方式,甚至是任何一种需要你自己在程序中生成响应的方式。

它还提供了一种定义,将 CORS 和 HTTP 原生的头信息结合起来,取代了原来那种分离的定义。

发送请求或者获取资源,需要使用  方法。它在很多接口中都被实现了,比如  和 。所以在各种环境中都可以用这个方法获取到资源。

 fetch() 必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 promise 对象,resolve 对应请求的 。你也可以传一个可选的第二个参数init(参见 )。

一旦  被返回,就有一些方法可以使用了,比如定义内容或者处理方法(参见 )。

你也可以通过  和  的构造函数直接创建请求和响应,但是我们不建议这么做。他们应该被用于创建其他 API 的结果(比如,service workers 中的 )。

 2.语法

Promise
fetch(input[, init]);

 

 参数:

?input 定义要获取的指定资源,可以是字符串也可以是Request对象

const myRequest = new Request('http://localhost/flowers.jpg');const myURL = myRequest.url; // http://localhost/flowers.jpgconst myMethod = myRequest.method; // GETconst myCred = myRequest.credentials; // omit
fetch(myRequest)  .then(response => response.blob()) .then(blob => { myImage.src = URL.createObjectURL(blob); });/pre>
 

 

init 可选一个配置项对象,包括所有对请求的设置。可选的参数有:

  • method: 请求使用的方法,如 GETPOST、put/delete/option/...
  • headers: 请求的头信息,形式为  的对象或包含  值的对象字面量。
  • body: 请求的 body 信息:可能是一个 、、、 或者  对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
  • mode: 请求的模式,如 cors、 no-cors 或者 same-origin。
  • credentials: 请求的 credentials,如 omitsame-origin 或者 include。为了在当前域名内自动发送 cookie , 必须提供这个选项, 从 Chrome 50 开始, 这个属性也可以接受  实例或是一个  实例。
  • cache:  请求的 cache 模式: default 、 no-store 、 reload 、 no-cache 、 force-cache 或者 only-if-cached 。
  • redirect: 可用的 redirect 模式: follow (自动重定向), error (如果产生重定向将自动终止并且抛出一个错误), 或者 manual (手动处理重定向). 在Chrome中,Chrome 47之前的默认值是 follow,从 Chrome 47开始是 manual。
  • referrer: 一个  可以是 no-referrerclient或一个 URL。默认是 client。
  • referrerPolicy: Specifies the value of the referer HTTP header. May be one of no-referrer、 no-referrer-when-downgrade、 origin、 origin-when-cross-origin、 unsafe-url 。
  • integrity: 包括请求的   值 ( 例如: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。

返回值:

一个 ,resolve 时回传  对象。

错误:

类型 描述
AbortError The request was aborted (using ).
TypeError Since , fetch() will throw a TypeError if the URL has credentials, such as http://user:password@example.com.

 

跨域资源共享() 是一种机制,它使用额外的  头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求

 

 

下面是使用Promise 封装了Fetch 并返回promise 对象

 

const headers = new Headers({  'Accept': 'application/json',  'Content-Type': 'application/json'});function get (url) {  return fetch(url, {    method: 'GET',    headers: headers  }).then(response => {    return handleResponse(url, response);  }).catch(err => {    console.error(`Request failed. Url = ${url} . Message = ${err}`);    return {error: {message: 'Request failed.'}};  })}function post (url, data) {  return fetch(url, {    method: 'POST',    headers: headers,    body: JSON.stringify(data)  }).then(response => {    return handleResponse(url, response);  }).catch(err => {    console.error(`Request failed. Url = ${url} . Message = ${err}`);    return {error: {message: 'Request failed.'}};  })}function put (url, data) {  return fetch(url, {    method: 'PUT',    headers: headers,    body: JSON.stringify(data)  }).then(response => {    return handleResponse(url, response);  }).catch(err => {    console.error(`Request failed. Url = ${url} . Message = ${err}`);    return {error: {message: 'Request failed.'}};  })}function handleResponse (url, response) {  if (response.status < 500) {    return response.json();  } else {    console.error(`Request failed. Url = ${url} . Message = ${response.statusText}`);    return {error: {message: 'Request failed due to server error '}};  }}export {get, post, put}

 

转载于:https://www.cnblogs.com/canghaiyimeng/p/9821770.html

你可能感兴趣的文章
DirectByteBuffer
查看>>
Docker Compose文件详解 V2
查看>>
Memcached的原理与应用(未完)
查看>>
基于 Confluence 6 数据中心的 SAML 单点登录设置你的身份提供者
查看>>
mysql总结
查看>>
Navicat for MySQL版本更新至v11.2.12,修复多项问题|附下载
查看>>
整理 JAVA中的IO流 (字符流和字节流两个大类)
查看>>
uefi与win8 (根据网络资料整理)
查看>>
Eclipse优化
查看>>
Log4j tutorial with Tomcat examples
查看>>
Kong 网关
查看>>
三层结构视频中的DBHelper.cs
查看>>
[转载] 信息系统项目管理师视频教程——18 项目沟通管理
查看>>
在Windows下建立QT开发环境
查看>>
Jedis、JedisPool、ShardedJedis和ShardedJedisPool,java对redis的基本操作
查看>>
[转载] 致命伴侣
查看>>
HTML5 localStorage本地存储实际应用举例
查看>>
Scala访问修饰符
查看>>
实习感悟
查看>>
产品经理网站小结
查看>>