当前位置: 首页 > news >正文

[转] 学会fetch的用法

fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法。参考阮老师的文章

那我们首先讲讲在没有fetch的时候,我们是如何获取异步资源的:

//发送一个get请求是这样的:

//首先实例化一个XMLHttpRequest对象
var httpRequest = new XMLHttpRequest();

//注册httpRequest.readyState改变时会回调的函数,httpRequest.
//readyState共有5个可能的值,
//0	UNSENT (未打开)	open()方法还未被调用;
//1	OPENED  (未发送)	send()方法还未被调用;
//2	HEADERS_RECEIVED (已获取响应头)	send()方法已经被调用, 响应头和响应状态已经返回;
//3	LOADING (正在下载响应体)	响应体下载中; responseText中已经获取了部分数据;
//4	DONE (请求完成)	整个请求过程已经完毕.
httpRequest.onreadystatechange = function(){
 //该回调函数会被依次调用4次
 console.log(httpRequest.readyState);

 if(httpRequest.readyState===4){
   //请求已完成
   if(httpRequest.status===200){
     //http状态为200
     console.log(httpRequest.response);

     var data = JSON.parse(httpRequest.response);
     console.log(data);
   }
 }

}

//请求的网址
var url = "http://127.0.0.1:7777/list";
//该方法为初始化请求,第一个参数是请求的方法,比如GET,POST,PUT,第二个参数是请求的url
httpRequest.open('GET',url,true);

//设置http请求头
httpRequest.setRequestHeader("Content-Type","application/json");

//发出请求,参数为要发送的body体,如果是GET方法的话,一般无需发送body,设为空就可以
httpRequest.send(null);

关于XMLHttpRequest的更多用法请参照:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest#open()

如果用了fetch之后,发送一个get请求是这样的:

//请求的网址
var url = "http://127.0.0.1:7777/list";
//发起get请求
var promise = fetch(url).then(function(response) {

   //response.status表示响应的http状态码
   if(response.status === 200){
     //json是返回的response提供的一个方法,会把返回的json字符串反序列化成对象,也被包装成一个Promise了
     return response.json();
   }else{
     return {}
   }

});
    
promise = promise.then(function(data){
  //响应的内容
	console.log(data);
}).catch(function(err){
	console.log(err);
})

接下来介绍下fetch的语法:

/**
参数:
input:定义要获取的资源。可能的值是:一个URL或者一个Request对象。
init:可选,是一个对象,参数有:
	method: 请求使用的方法,如 GET、POST。
	headers: 请求的头信息,形式为 Headers 对象或 ByteString。
	body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
	mode: 请求的模式,如 cors、 no-cors 或者 same-origin,默认为no-cors,该模式允许来自 CDN 的脚本、其他域的图片和其他一些跨域资源,但是首先有个前提条件,就是请求的 method 只能是HEAD、GET 或 POST。此外,如果 ServiceWorkers 拦截了这些请求,它不能随意添加或者修改除这些之外 Header 属性。第三,JS 不能访问 Response 对象中的任何属性,这确保了跨域时 ServiceWorkers 的安全和隐私信息泄漏问题。cors模式允许跨域请求,same-origin模式对于跨域的请求,将返回一个 error,这样确保所有的请求遵守同源策略。
	credentials: 请求的 credentials,如 omit、same-origin 或者 include。
	cache:  请求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.
返回值:一个 Promise,resolve 时回传 Response 对象。
*/
fetch(input, init).then(function(response) {  });

一个发送post请求的示例:

fetch("http://127.0.0.1:7777/postContent", {
  method: "POST",
  headers: {
      "Content-Type": "application/json",
  },
  mode: "cors",
  body: JSON.stringify({
      content: "留言内容"
  })
}).then(function(res) {
  if (res.status === 200) {
      return res.json()
  } else {
      return Promise.reject(res.json())
  }
}).then(function(data) {
  console.log(data);
}).catch(function(err) {
  console.log(err);
});

如果考虑低版本浏览器的问题的话,引入https://github.com/github/fetch/blob/master/fetch.js 即可兼容。

转载于:https://www.cnblogs.com/chris-oil/p/8430447.html

相关文章:

  • Excel导入功能测试用例整理
  • DAY9-python并发之多进程
  • 常用特殊符号的HTML代码(HTML字符实体)
  • Java开发Tips
  • CUDA学习(十九)
  • export和import的用法总结
  • Picasso源码阅读笔记九
  • 《Python编程快速上手》第8.9.2实践练习
  • Intel发布P4500、P4600 NVMe SSD:规格释疑
  • Gradle:Gradle入门
  • 超简便安装mysql
  • 个人开发—进度记录(十)
  • 【技巧】从键盘读入一串字符并输出
  • [转] Webpack 打包优化之体积篇
  • Java并发编程实战系列16之Java内存模型(JMM)
  • [译]前端离线指南(上)
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JS题目及答案整理
  • mysql_config not found
  • Promise面试题,控制异步流程
  • SQLServer之索引简介
  • Transformer-XL: Unleashing the Potential of Attention Models
  • ucore操作系统实验笔记 - 重新理解中断
  • 笨办法学C 练习34:动态数组
  • 简析gRPC client 连接管理
  • 力扣(LeetCode)21
  • 力扣(LeetCode)22
  • 如何胜任知名企业的商业数据分析师?
  • 使用agvtool更改app version/build
  • 自制字幕遮挡器
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Nginx实现动静分离
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何在招聘中考核.NET架构师
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #QT(串口助手-界面)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (分布式缓存)Redis哨兵
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (译) 函数式 JS #1:简介
  • .equals()到底是什么意思?
  • .Net MVC4 上传大文件,并保存表单
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET中 MVC 工厂模式浅析
  • .考试倒计时43天!来提分啦!
  • []常用AT命令解释()
  • [ACM] hdu 1201 18岁生日
  • [APIO2015]巴厘岛的雕塑
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]