fetch-基础-配置-get-post-上传

1.前言

1.之前写了篇文章前端请求的5种方式
2.其中 fetch 的方式应该还是 不熟悉
3.所以这篇文章详细的梳理下 fetch


2. 是什么

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵HTTP 管道的一些具体部分
例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源

这种功能以前是使用 XMLHttpRequest 实现的。
Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用,
例如 Service Workers (en-US)。Fetch 还提供了专门的逻辑空间来定义其他与 HTTP 相关的概念,
例如 CORSHTTP的扩展。

简单总结的话 就是类似 axios,使用Promise语法,
但是浏览器原生支持,不需要下载第三方的文件


3. 基础语法 get请求

3.1 简要demo

let registerFn = () => {
            fetch(`/getData?name=${userName.value}&password=${password.value}`).then(res => {
                return res.json()
            }).then(res => {
                console.log("get 结果:", res)
            }).catch(error => {
                console.log("错误:", error)
            })
        }

3.2 简要分析

  1. 默认是 get请求
  1. fetch()2个参数
    参数1: 服务器地址
    参数2: 可选的 配置参数
    HTTP 请求的方法、标头、数据体都在这个对象里面设置

3.fetch()采用模块化设计,API 分散在多个对象上(Response对象、Request对象、Headers对象)
4.fetch()使用 Promise,不使用回调函数,因此大大简化了写法,写起来更简洁
5.response是一个 Stream 对象


3. 配置参数

HTTP 请求的方法、标头、数据体都在这个对象里面设置

{
    body: JSON.stringify(data), //必须和'Content-Type' 匹配
    cache: 'no-cache', // 是否需要缓存,可以的值, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, same-origin, *omit
    headers: {
      'user-agent': 'Mozilla/4.0 MDN Example',
      'content-type': 'application/json'
    },
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, cors, *same-origin
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // *client, no-referrer
  }

3.1 credentials

include 浏览器发送 cookie(即使是跨域源也发送)
same-origin 和 脚本 同源 才发送cookie
omit 不使用 cookie


3.2 第一个then

一般第一个 then 做一个数据的 格式化
例如: res.json()


4. post请求 常用配置

服务器 本地用node随便写的
下面是 post写法

 let loginFn = async () => {
            let data = {
                name: "yzs",
                password: "123456"
            }
            try {
                let res = await fetch("/login", {
                    method: "POST",
                    body:JSON.stringify(data)
                }).then(res => res.json())
                console.log("post 结果:", res)

            } catch (error) {
                // fetch 里面的 catch
                console.log("error:", error)
            }
        }


5. post 单文件上传

 let upload = async () => {
            let file = document.querySelector("input[type=file]").files[0];
            //   表单数据对象
            let formatData = new FormData()
            // 第一个 key           fileInfo
            // 第二个value是对应的值 file
            // 把上传的内容添加到表单 数据对象里面
            formatData.append("fileInfo", file)
            try {
                let res = await fetch("/myupload", {
                    method: "POST",
                    body: formatData
                }).then(res => res.json())
                showImg.src = res.path
                console.log("成功:", res);

            } catch (error) {
                console.log("error", error)
            }
        }

6. post 多文件上传配置

var formData = new FormData();
var photos = document.querySelector("input[type='file'][multiple]");

formData.append('title', 'My Vegas Vacation');
// formData 只接受文件、Blob 或字符串,不能直接传递数组,所以必须循环嵌入
for (let i = 0; i < photos.files.length; i++) {
    formData.append('photo', photos.files[i]);
}

7. 重点 post 请求头配置

postbody 数据要和 content-type匹配不然请求不成功

7.1 json数据配置

const response = await fetch('/login', {
  method: 'POST',
   body: JSON.stringify({ name: "yzs尹",password:"123456" }),
 headers: {
                    'Content-Type': 'application/json;charset=utf-8'
                }
})


7.2 key-value配置

const response = await fetch('/list', {
  method: 'POST',
  headers: {
    "Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  },
  body: 'name=yzs&password=123456'
})


7.3 表单配置

const form = document.querySelector('form');
 const response = await fetch('/submit', {
  method: 'POST',
  body: new FormData(form)
})

7.4 上传配置

const input = document.querySelector('input[type="file"]');

const data = new FormData();
data.append('file', input.files[0]);
//额外追加数据
data.append('name', 'yzs');

fetch('/upload', {
  method: 'POST',
  body: data
});

上传 肯定得通过表单 ,所以其实和表单提交 差不多


7.4 二进制数据

做一些图片的转化 时会用到二进制上传

let blob = await new Promise(resolve =>   
  canvasElem.toBlob(resolve,  'image/png')
);

let response = await fetch('/user/avatar', {
  method:  'POST',
  body:data

canvasElem 借助画布的toBlob功能
也可以使用画布的toDataURL


参考资料

fetch-MDN
阮一峰-fetch

初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切都是为了部落的崛起
共勉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354