對于前端請求fetch的詳解

前言:

這里需要說明一下,fetch執(zhí)行之后會(huì)回調(diào)一個(gè)promise對象,所以如果沒了解過promise用法的可以去了解一下

至于為什么要用fetch?試想一下一個(gè)場景,用傳統(tǒng)xhr按順序訪問兩個(gè)異步接口,如果第一個(gè)接口訪問失敗了,那第二個(gè)接口就不能在繼續(xù)進(jìn)行了,但用fetch就能處理這種情況了。


進(jìn)入開發(fā)

首先第一步,按照官方文檔的說法,我們需要先創(chuàng)建一個(gè)request對象作為fetch執(zhí)行參數(shù)

const myRequest = new Request(url, init);  

或者

const myRequest = new Request(requestJson);

其中url為請求地址,init為設(shè)置的相關(guān)屬性,requestJson是request對象,兩者參數(shù)相似

method - 使用的HTTP動(dòng)詞,GET, POST, PUT, DELETE, HEAD
url - 請求地址,URL of the request
headers - 關(guān)聯(lián)的Header對象
referrer - referrer
mode - 請求的模式,主要用于跨域設(shè)置,cors, no-cors, same-origin
credentials - 是否發(fā)送Cookie omit, same-origin
redirect - 收到重定向請求之后的操作,follow, error, manual
integrity - 完整性校驗(yàn)
cache - 緩存模式(default, reload, no-cache)

這里注意一下,requestJson和init中有一個(gè)mode參數(shù),可以設(shè)置請求模式,對于跨域請求(no-cors:僅用于請求文件的時(shí)候使用;cors:跨域需要前后端設(shè)置頭部信息)等問題是一個(gè)比較簡易的解決方式

關(guān)于response
在用到ServiceWorkers的時(shí)候我們可能需要新建一個(gè)response對象,但一般不需要?jiǎng)?chuàng)建

var response = new Response('...',{
    ok:false,
    status:404,
    url:'/'
})

下面,我們來創(chuàng)建一個(gè)基本的fetch

const req=new Request('http://hd2.nfapp.southcn.com/wx/getShareSignInfo',{method:'get',cache:false,mode:"no-cors"});

fetch(req).then((response)=>{
            console.log(response);
            if(response.ok)return response.json();
        }
).then((result)=>{
    console.log(result);
}).catch((e)=>{
    console.log(e);
});

這里我們能看到我們接收到的并不是后臺接口回傳的參數(shù),而是一個(gè)包含有狀態(tài)、請求類型和回傳參數(shù)等的一個(gè)json;


上面是一個(gè)基本的請求,下面我們來看看如果需要發(fā)送參數(shù)post和get方法的區(qū)別

對于get方法

我們知道用get方法傳參的話需要封在url頭部,因?yàn)間et方法并沒有body作為載體去傳輸數(shù)據(jù)的,而對于fetch的使用如下:
首先創(chuàng)建一個(gè)供我們發(fā)送的參數(shù)

let sendData=new URLSearchParams();//創(chuàng)建url格式參數(shù)

在參數(shù)中插入key,val

sendData.append("name",123);

然后我們需要在我們的請求參數(shù)的url加上參數(shù)

const req=new Request('url?'+sendData,{method:'get',cache:false,mode:"no-cors"});

對于post方法

post和get傳參是不一樣的,用post方式傳參的話需要把參數(shù)加在body上,創(chuàng)建發(fā)送參數(shù)的方法也有所不同,但大同小異,直接上代碼:

let sendData=new formData();//創(chuàng)建數(shù)據(jù)格式參數(shù)
sendData.append("name",123);

const req=new Request('url',{method:'get',cache:false,mode:"no-cors",body:sendData});

至此,fetch的基本請求已經(jīng)完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 小伙子 你這樣做不對 你把瓶子扔進(jìn)綠化帶里 你說多難清理 旁邊就是垃圾桶 為什么不扔進(jìn)去呢 只見大娘一個(gè)帥氣的眼神...
    硬漢奶爸閱讀 169評論 0 0
  • 最近,一直有一種感覺,感覺近來的自己讀西方名著甚于中國古典,想要有意識的去調(diào)整一下。 昨夜,坐在燈前讀《東周列國志...
    Allison甘甘閱讀 786評論 0 51
  • 長大多好,懂得了有有意識尋找曾丟失的那部分自己,長大多好,學(xué)會(huì)嘗試彌補(bǔ)未曾開發(fā)的那部分自己,長大多好,不用再盲目活...
    Sylvia睿閱讀 251評論 0 0
  • “當(dāng)當(dāng)當(dāng)”放學(xué)了,同學(xué)們“刷”的一聲站起來,盡管老師扯著嗓子喊,可,也抵擋不住同學(xué)們的興奮之情,同學(xué)們伸一個(gè)懶...
    王鈺清wyq閱讀 576評論 0 2