您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JavaScript Fetch API 新手入门指导

时间:2019-08-21 15:21:24  来源:  作者:
JavaScript Fetch API  新手入门指导

 

自从Fetch API 问世以来,我们就能使用漂亮的语法发送HTTP Request 或取后台接口数据,这篇文章将会分享我自己常用的Fetch方法( GET、POST、搭配await 或promise.all...等) ,随着浏览器的普遍支持,也就不太需要使用XMLHttpRequest 或jQuery AJAX,我们的代码看起来也就更加简洁干净啰~

Fetch 基本用法

fetch()方法,包含了需要fetch 的网址和对应的属性设定( 例如method、headers、mode、body...等,最基本的写法属性不一定要填),执行之后会送出Request,如果得到回应就会回传带有Response 的Promise 内容,使用then 将回传值传递下去。

fetch('网址')
.then(function(response) {
 // 处理 response
}).catch(function(err) {
 // 错误处理
});

举例来说,通过天气数据开放平台可以取得许多气象资料(例如阿里云的API开放平台),下面的示例获取北京的当日气温,因为结果返回为json格式,所以在fetch取得数据之后,通过json()的方法处理数据,接着传递到下一层,就能显示出「北京市的当日气温」。

fetch('天气数据开放平台网址')
.then(res => {
 return res.json();
}).then(result => {
 let city = result.cwbopendata.location[14].parameter[0].parameterValue;
 let temp = result.cwbopendata.location[14].weatherElement[3].elementValue.value;
 console.log(`${city}的当前气温 ${temp} 摄氏度`); // 得到 北京市的气温 29.30摄氏度
});

Fetch 的 Request 属性

以下列出Fetch常用的的Request属性。(更多属性请参考fetch Request )

JavaScript Fetch API  新手入门指导

 

Fetch 的Response 属性

以下列出Fetch常用的Response属性。(更多属性和方法请参考fetch Response )

JavaScript Fetch API  新手入门指导

 

Fetch 的Response 方法

以下列出Fetch常用的Response方法。(更多属性和方法请参考fetch Response )

JavaScript Fetch API  新手入门指导

 

Fetch 的Get 用法

Get 是Fetch 最简单的方法,使用Get 必须要将fetch 第二个参数里的method 设定为get,如果遇到跨域问题,就搭配其他属性例如mode、credentials 来进行细部设定( 但针对非跨域的就没用了),下方的示例我做了一个简单的后端请求,通过fetch 传递姓名和年纪的参数,就会看到后端回应一串文字。

const name = 'oxxo';
const age = 18;
const uri = `https://网址/exec?name=${name}&age=${age}`;
fetch(uri, {method:'GET'})
.then(res => {
 return res.text(); 
// 使用 text() 可以得到纯文字 String
}).then(result => {
 console.log(result); 
// 得到「你的名字是:oxxo,年紀:18 岁。」
});

Fetch 的Post 用法

使用POST方法可以搭配body属性设定传递参数,比如我的接口地址,可以接收name和age所组成的JSON请求,当网址接收到要求后,就会回应一个json对象,需要注意的是,如果是传递「中文」可能会出现乱码,这时可以使用encodeURI来做转码,且要通过JSON.stringify来转换成string方式传递。

const uri = '网址';
fetch(uri, {
 method:'POST',
 body:encodeURI(JSON.stringify({
 name:'oxxo',
 age:18
 })),
 headers: {
 'Content-Type': 'Application/x-www-form-urlencoded; charset=utf-8'
 }
})
.then(res => {
 return res.json(); 
// 使用 json() 可以得到 json 对象
}).then(result => {
 console.log(result);
 // 得到 {name: "oxxo", age: 18, text: "你的名字是 oxxo,年纪18岁~"}
});

Fetch 搭配async、await、promise.all

过去在XMLHttpRequest 或jQuery AJAX 的全盛时期,如果要确保每个GET 或POST 的要求,都要按照指定的顺序进行,往往会用上一连串的callback 辅助,但是当callback 越来越多,代码也就越来越难管理,然而fetch 返回的是一个Promise,我们也就能直接利用await 或promise.all 的作法,轻松掌握同步与非同步之间的转换。

下方的例子是一个非同步的示例,因为没有进行任何的同步处理,所以执行之后,会先出现hello的文字,接着才是通过fetch 得到的结果。

const postURL = (name,age) => {
 const uri = 'https://网址;
 return fetch(uri, {
 method:'POST',
 body:encodeURI(JSON.stringify({
 name:name,
 age:age
 })),
 headers: {
 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
 }
 })
 .then(res => {
 return res.json();
 }).then(result =>{
 console.log(result);
 });
};
postURL('oxxo',18);
console.log('hello!!!');
postURL('tom',18);

因为fetch 的特性,可以改成async 和await 的写法,执行后也就能按照我们要的顺序进行。

async function(){ // 设定为 async
 const postURL = (name,age) => {
 const uri = 'https://网址';
 return fetch(uri, {
 method:'POST',
 body:encodeURI(JSON.stringify({
 name:name,
 age:age
 })),
 headers: {
 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
 }
 })
 .then(res => {
 return res.json();
 }).then(result =>{
 console.log(result);
 });
 };
 await postURL('oxxo',18); 
// 使用 await
 console.log('hello!!!');
 await postURL('tom',18); 
// 使用 await
}();

最后那段await 的代码,也可以改成promise.all 的方法,就会先fetch,然后再出现hello的文字,不过也因为promise.all无法保证其载入顺序,就可能会发生tom 在oxxo之前出现的状况呦。

await Promise.all([postURL('oxxo',18), postURL('tom',18)]);
console.log('hello!!!');

兼容性

说了这么多,你一定关心这个API的兼容性,现代浏览器大部分还是支持的,可以放心使用,如下图所示:

JavaScript Fetch API  新手入门指导

 

文章来源:https://www.oxxostudio.tw/articles/201908/js-fetch.html

原文作者:oxxostudio

由于网页为繁体内容,术语描述和话术与我们有差异的问题,笔者在保证不改变原意的基础上做了调整,并在此基础上进行了错误校正,如发现问题,欢迎你的指正

 

小结

Fetch API 的神奇,简化了许多原本较为复杂的用法,也让项目代码写起来更加干净易读好维护。

更多参考资源:

MDN:Using Fetch

https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch

AJAX 与Fetch API

https://eyesofkids.gitbooks.io/JAVAscript-start-from-es6/content/part4/ajax_fetch.html

更多精彩内容,请关注“前端达人”公众号



Tags:JavaScript Fetch   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
自从Fetch API 问世以来,我们就能使用漂亮的语法发送HTTP Request 或取后台接口数据,这篇文章将会分享我自己常用的Fetch方法( GET、POST、搭配await 或promise.all...等) ,随...【详细内容】
2019-08-21  Tags: JavaScript Fetch  点击:(245)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(19)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(35)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(36)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(40)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== '') { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(51)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条