前端三剑客——javascript-fetchAPI
大纲:
1.初识fetch请求
用Promise处理fetch异步请求
用Async/await处理fetch异步请求
发起除GET请求时第二个参数的配置
2.Response对象
属性
方法
3.函数封装fetch请求
调用封装函数格式
封装后fetch请求格式
初识fetch请求
用Promise处理fetch异步请求
用Async/await处理fetch异步请求
//接口地址: http://ajax-base-api-t.itheima.net/api/getbooks
//fetch函数(异步操作)只有一个参数默认向服务器发送GET请求
/**
* fetch发起GET请求的异步操作格式
* fetch(URL)
* 若只有一个参数(URL)则是发送GET请求,且返回的是Promise对象
* 若想查具体的内容url后面加: ?key1=value&key2=value
*
*
* 真正拿到数据过程:
* 先等请求出结果(拿到Response),在等响应体解析(反序列化),最终拿到能用的js数据---全过程靠2次Promise等待实现: 即对应的2次.then()或者2次await
*
* 首先fetch请求(得到Promise对象).then()/await得到Response对象
* 再Response对象.json()进行响应体解析(反序列化)得到Promise对象
* 然后在.then()/await得到可用的js数据
*
* Response对象.json():读取str(原始JSON格式数据)+JSON.parse(str)
*/
// //测试一(用Promise处理异步操作)
fetch('http://ajax-base-api-t.itheima.net/api/getbooks').then(res => res.json()).then(res=>console.log(res))
//测试二(用Async/await处理异步操作)
async function getData(){
//用fetch函数发起GET请求
//发请求从服务器获取数据
let result = await fetch('http://ajax-base-api-t.itheima.net/api/getbooks?id=2')
//将获取的数据进行对应的解析
let json = await result.json()
console.log(json);
}
getData()
发起除GET请求时第二个参数的配置
//fetch函数(异步操作)为其设置第二个参数向服务器发送指定请求
/**
* 给fetch配置第二个参数用来定义发起的 HTTP请求(请求行,请求头,请求体)
* 格式
* fetch(url,{
* method:'请求方式'
* headers:{
* ‘Content-Type’:'数据格式' //向服务器说明请求体中数据格式(请求体一般将数据转换为JSON格式后发给服务器)
* }
* body:'请求体数据'
* })
*/
//测试一
async function addbook() {
const data = {bookname: 'n1', author: 'nn', publisher: 'nn'}
//调用fetch函数发起HTTP请求(POST),并接收Response对象
let res = await fetch('http://ajax-base-api-t.itheima.net/api/addbook', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
//对响应结果数据进行数据解析
let json = await res.json()
console.log(json)
}
addbook()
Response对象
// Response对象(了解)
// 用fetch()发起请求会得到Promise对象,只要服务器成功接受请求并且返回了HTTP响应(无论状态码是成功2xx还是错误4xx/5xx)fetch返回的Promise对象都会兑现为Response对象(即.then())
// 发起HTTP请求如果中间断网,则服务器不能接收到请求且无法返回HTTP响应
/**
* Response对象的属性
* .ok: 返回布尔类型表示请求是否成功
* .status: 返回数字表示HTTP响应的状态码
* .statusText: 返回文本形式的状态描述
* .url: 返回请求的url地址
*
*
* Response对象常见的方法
* 根据服务器返回的不同数据类型,提供了不同方法
* 最常见的方法: Response对象.json(): 将服务器返回的JSON格式字符串解析为js中的数据类型
*/
//测试一
async function getBooks(){
let res = await fetch('http://ajax-base-api-t.itheima.net/api/getbooks');
console.log(res);
console.log(res.ok); //Response对象
console.log(res.status); //200
console.log(res.statusText); //OK
console.log(res.url); //http://ajax-base-api-t.itheima.net/api/getbooks
}
getBooks()

函数封装fetch请求
////对fetch函数发起请求的过程进行函数的封装
/**
* 理解:
* 将fetch请求封装到http函数中,利用解包操作得到对应的url method params(具体的请求要查询/删除参数,利用封装好的函数将会自动拼接到url后) data(要添加/修改/删除的内容)
* 避免发起不同请求时重复写fetch请求格式,直接调用封装好的函数
* js中对象解包不是按顺序接收,而是按属性接收
*
* 封装时url路径拼接参数方法:
*
* 简单键值对(如 { name: 'a', age: 18 }):可以用 URLSearchParams 转换
* new URLSearchParams():
* {key1:value,key2:value}-->key1=value$key2&value
* new URLSearchParams().toString():
* 将参数转换成: key1=value$key2&value且变成字符串形式,便于再url后进行'?'和其的拼接
*
* 复杂键值对(如 { ids: [1,2,3], user: { id: 1 } }):不推荐直接用 URLSearchParams
* 建议先把属性值转为 JSON 字符串传递,后面再进行:new URLSearchParams().toString()
* 如果是DELETER请求删除多个数据 其可选择是params(转换后拼接到url后)或者data(body: JSON.stringify(data))
*
* 调用已经封装好了http函数(用fetch发起请求)
* 如果是method:'DELETE请求删除多个数据 其可选择是params(转换后拼接到url后)或者data(body: JSON.stringify(data))
*
* //GET/DELETE
*http({
* url:‘xxx’,
* method:'xxx',
* params(可选,若要查询某个具体的信息则写):{}
*})
* //POST/PUT/PATCH/DELETE
* http({
* url:‘xxx’,
* method:'xxx',
* data:{}
* })
*
*/
用函数封装fetch请求-外部js文件
//用函数封装fetch请求
async function http(obj) {
//js中对象解包不是按顺序接收,而是按属性接收
let {url, method='GET', params, data} = obj;
//如果有params则先处理url: url?key1=value&key2=value
if (params) {
let str = new URLSearchParams(params).toString();
url += '?' + str;
}
//根据是否有data来设置第二个参数格式
try {
let res = undefined;
if (data) {
//如果有body则是发起DELETE/POST/PUT/PATCH请求
res = await fetch(url, {
method: method,
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
})
} else {
//没有则是发起GET/未带body而是url拼接params的DELETE请求
res = await fetch(url,{method:method})
}
if(!res.ok) {
throw new Error(`${method},${url}失败:${res.status},${res.statusText}`);
}
return res;
}catch(err) {
throw err;
}
}
<script src="http.js"></script>
async function look() {
try {
let res = await http({
method: 'GET',
url: 'http://ajax-base-api-t.itheima.net/api/getbooks'
});
let json = await res.json()
console.log(json);
} catch (err) {
console.log(err)
}
}
look()
//测试二
async function add() {
try {
let res = await http({
method: 'POST',
url: 'http://ajax-base-api-t.itheima.net/api/adddbook',
data: {
bookname: 'n1',
author: 'nn',
publisher: 'nn'
}
})
let json = await res.json()
console.log(json)
} catch (err) {
console.log(err)
}
}
add()
函数(http函数)封装fetchAPI
https://blog-static.cnblogs.com/files/blogs/853151/http.js?t=1762874469&download=true
此随笔代码笔记
blog-static.cnblogs.com/files/blogs/853151/代码笔记.js?t=1762915425&download=true
浙公网安备 33010602011771号