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 瀏覽器發(fā)送 cookie(即使是跨域源也發(fā)送)
same-origin 和 腳本 同源 才發(fā)送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 或字符串,不能直接傳遞數組蜕窿,所以必須循環(huán)嵌入
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

初心

我所有的文章都只是基于入門谋逻,初步的了解;是自己的知識體系梳理;
如果能幫助到有緣人,非常的榮幸,一切都是為了部落的崛起
共勉
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末桐经,一起剝皮案震驚了整個濱河市毁兆,隨后出現的幾起案子,更是在濱河造成了極大的恐慌阴挣,老刑警劉巖气堕,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異畔咧,居然都是意外死亡茎芭,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門盒卸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骗爆,“玉大人,你說我怎么就攤上這事蔽介≌叮” “怎么了煮寡?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犀呼。 經常有香客問我幸撕,道長,這世上最難降的妖魔是什么外臂? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任坐儿,我火速辦了婚禮,結果婚禮上宋光,老公的妹妹穿的比我還像新娘貌矿。我一直安慰自己,他們只是感情好罪佳,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布逛漫。 她就那樣靜靜地躺著,像睡著了一般赘艳。 火紅的嫁衣襯著肌膚如雪酌毡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天蕾管,我揣著相機與錄音枷踏,去河邊找鬼。 笑死掰曾,一個胖子當著我的面吹牛旭蠕,可吹牛的內容都是我干的。 我是一名探鬼主播旷坦,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼下梢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塞蹭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讶坯,失蹤者是張志新(化名)和其女友劉穎番电,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體辆琅,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡漱办,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了婉烟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娩井。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖似袁,靈堂內的尸體忽然破棺而出洞辣,到底是詐尸還是另有隱情咐刨,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布扬霜,位于F島的核電站定鸟,受9級特大地震影響,放射性物質發(fā)生泄漏著瓶。R本人自食惡果不足惜联予,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望材原。 院中可真熱鬧沸久,春花似錦、人聲如沸余蟹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽客叉。三九已至诵竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兼搏,已是汗流浹背卵慰。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佛呻,地道東北人裳朋。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吓著,于是被迫代替她去往敵國和親鲤嫡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355