国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

fetch與ajax(XMLHttpRequest)相比

diabloneo / 2532人閱讀

摘要:前言中新增了一種數(shù)據(jù)請求的方式,就是,它和有許多相似的功能,但是相比被設(shè)計成更具可擴(kuò)展性和高效性。該模式支持跨域請求,顧名思義它是以的形式跨域當(dāng)然該模式也可以同域請求不需要后端額外的支持其對應(yīng)的為。

前言 ES6中新增了一種HTTP數(shù)據(jù)請求的方式,就是fetch,它和XMLHttpRequest有許多相似的功能,但是相比XMLHttpRequest,fetch被設(shè)計成更具可擴(kuò)展性和高效性。江湖上一直流傳著 “傳統(tǒng)ajax已死,fetch永生”的說法,下面詳細(xì)說下二者 詳情 1.XMLHttpRequest 請求數(shù)據(jù)
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.responseType = "json";

xhr.onload = function() {
  console.log(xhr.response);
};

xhr.onerror = function() {
  console.log("Oops, error");
};

xhr.send();
2. fetch請求數(shù)據(jù)
fetch(url)
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(e => console.log("Oops, error", e))

兩段代碼相比之下,fetch更為簡潔,而且fetch請求屬于promise結(jié)構(gòu),直接.then()方法處理回調(diào)數(shù)據(jù),當(dāng)出錯時,會執(zhí)行catch方法,而且promise避免了回調(diào)金字塔的問題。

3.fetch瀏覽器支持情況

目前谷歌瀏覽器對fetch的支持良好,具體支持情況如下圖

當(dāng)然,你也可以去這里查看can i use

4.fetch請求的四種方式 get請求
fetch(url)
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(e => console.log("Oops, error", e))

如果需要傳遞參數(shù),需要拼接在url
后面這里的調(diào)用的第一個then函數(shù)里面,返回結(jié)果是一個可讀流形式

如果請求的是json數(shù)據(jù),需要調(diào)用response.json()(這里的response是傳遞的參數(shù))將可讀流解析為json數(shù)據(jù),在下一個then方法中,就可以得到想要的json數(shù)據(jù)了

同理,如果請求的txt文本數(shù)據(jù),則需要調(diào)用response.text()來解析...更多調(diào)用的解析方法如下

response.arrayBuffer()
讀取 Response對象并且將它設(shè)置為已讀(因?yàn)镽esponses對象被設(shè)置為了 stream 的方式,所以它們只能被讀取一次) ,并返回一個被解析為ArrayBuffer格式的promise對象

response.blob()
讀取 Response對象并且將它設(shè)置為已讀(因?yàn)镽esponses對象被設(shè)置為了 stream 的方式,所以它們只能被讀取一次) ,并返回一個被解析為Blob格式的promise對象

response.formData()
讀取Response對象并且將它設(shè)置為已讀(因?yàn)镽esponses對象被設(shè)置為了 stream 的方式,所以它們只能被讀取一次) ,并返回一個被解析為FormData格式的promise對象

response.json()
讀取 Response對象并且將它設(shè)置為已讀(因?yàn)镽esponses對象被設(shè)置為了 stream 的方式,所以它們只能被讀取一次) ,并返回一個被解析為JSON格式的promise對象

response.text()
讀取 Response對象并且將它設(shè)置為已讀(因?yàn)镽esponses對象被設(shè)置為了 stream 的方式,所以它們只能被讀取一次) ,并返回一個被解析為USVString格式的promise對象

對于catch方法,只有報程序出錯的時候才會執(zhí)行。

post請求
 fetch(url,{
            method:"POST",
            headers:{
                "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
            },
            body:data
        })
        .then(res=>res.json())
        .then(data=>console.log(data))

method:設(shè)置設(shè)置請求的方式,默認(rèn)是get,另外還有PUT、DELETE
headers:設(shè)置請求頭信息,當(dāng)然,這里面還可以設(shè)置別的信息,比如:

var u = new URLSearchParams();
u.append("method", "flickr.interestingness.getList");
u.append("api_key", "");
u.append("format", "json");
u.append("nojsoncallback", "1");

fetch(url,{
            method:"POST",
            headers:u,
            body:data
        })
        .then(res=>res.json())
        .then(data=>console.log(data))

另外,fetch可以在header中設(shè)置CORS跨域

    u.append("Access-Control-Allow-Origin", "*");  
    u.append("Access-Control-Allow-Headers", "X-Requested-With");  
    u.append("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  
    u.append("X-Powered-By"," 3.2.1")  
如果服務(wù)器不支持CORS,fetch提供了三種模式,其中no-cors可以繼續(xù)訪問服務(wù)器

fetchmode配置項有3個值,如下:

same-origin:該模式是不允許跨域的,它需要遵守同源策略,否則瀏覽器會返回一個error告知不能跨域;其對應(yīng)的response type為basic。

cors: 該模式支持跨域請求,顧名思義它是以CORS的形式跨域;當(dāng)然該模式也可以同域請求不需要后端額外的CORS支持;其對應(yīng)的response typecors。

no-cors: 該模式用于跨域請求但是服務(wù)器不帶CORS響應(yīng)頭,也就是服務(wù)端不支持CORS;這也是fetch的特殊跨域請求方式;其對應(yīng)的response typeopaque。

針對跨域請求,cors模式是常見跨域請求實(shí)現(xiàn),但是fetch自帶的no-cors跨域請求模式則較為陌生,該模式有一個比較明顯的特點(diǎn):

該模式允許瀏覽器發(fā)送本次跨域請求,但是不能訪問響應(yīng)返回的內(nèi)容,這也是其response type為opaque透明的原因,如下圖:

呃,感覺這樣雖然解決能跨域問題,但是請求不到任何數(shù)據(jù),還是沒有卵用...

注意: cors 支持 三種content-type 不支持 application/json

application/x-www-form-urlencoded

multipart/form-data

text/plain

body:需要傳遞的參數(shù)

fetch請求默認(rèn)是不會攜帶cookie信息,如果想要攜帶,需要在手動設(shè)置

fetch(url, {
              method: "POST",
              headers:{
                "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
                },
              credentials: "include" 
            })

credentials: "include" 設(shè)置請求頭攜帶cookie信息

put請求
 fetch(url,{
            method:"PUT",
            headers:{
                "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
            },
            body:data
        })
        .then(res=>res.json())
        .then(data=>console.log(data))
delete請求
 fetch(url,{
            method:"DELETE",
            headers:{
                "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
            },
            body:data
        })
        .then(res=>res.json())
        .then(data=>console.log(data))

其實(shí),post,put,delete,這三個請求代碼上差不多,只是method中對應(yīng)不同的請求方法不同而已。

如下是自己封裝的fetch的API代碼 HTML頁面



  
  
  
  Document



  
  

app.js
const url = "http://jsonplaceholder.typicode.com/users";

let easyHttp = new EasyHttp;

// 請求數(shù)據(jù)
easyHttp.get(url)
        .then(res=>console.log(res))
        .catch(err=>console.log(err))


// 發(fā)送數(shù)據(jù)
const data = {
    name:"Henry",
    username:"露絲",
    email:"lusi@qq.com"
  };
// easyHttp.post(url,data)
//         .then(res=>console.log(res))
//         .catch(err=>console.log(err))


// 修改數(shù)據(jù)
// easyHttp.put(url+"/10",data)
//         .then(res=>console.log(res))
//         .catch(err=>console.log(err))

easyHttp.delete(url+"/2",data)
        .then(res=>console.log(res))
        .catch(err=>console.log(err))  
       
easyhttp.js
/**
 * fetch 增刪改查 的API封裝
 */

 class EasyHttp{
    //  get 請求
    get(url){
        return new Promise((resolve,reject)=>{
            fetch(url)
                .then(res=>res.json())
                .then(data=>resolve(data))
                .catch(err=>reject(err))
        })
    }

    // post 請求

    post(url,data){
        return new Promise((resolve,reject)=>{
            fetch(url,{
                method:"POST",
                headers:{
                    "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
                },
                body:data
            })
            .then(res=>res.json())
            .then(data=>resolve(data))
            .then(err=>reject(err))
        })
    }


    // put 請求修改數(shù)據(jù)
    put(url,data){
        return new Promise((resolve,reject)=>{
            fetch(url,{
                method:"PUT",
                headers:{
                    "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
                },
                body:data
            })
            .then(res=>res.json())
            .then(data=>resolve(data))
            .then(err=>reject(err))
        })
    }

      // delete 刪除數(shù)據(jù)
      delete(url,data){
        return new Promise((resolve,reject)=>{
            fetch(url,{
                method:"DELETE",
                headers:{
                    "Content-type":"application/json"http:// 設(shè)置請求頭數(shù)據(jù)類型
                },
                body:data
            })
            .then(res=>res.json())
            .then(data=>"刪除數(shù)據(jù)成功。。。")
            .then(err=>reject(err))
        })
    }

 }

源碼地址:戳一下

最后總結(jié)

fetchXMLHttpRequest相比,主要有以下優(yōu)點(diǎn):

語法簡潔,更加語義化

基于標(biāo)準(zhǔn) Promise 實(shí)現(xiàn),支持 async/await

同構(gòu)方便,使用 isomorphic-fetch

參考文章 MDN Fetch API ECMAScript 6 入門 Fetch相比Ajax有什么優(yōu)勢? 【fetch跨域請求】cors

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93637.html

相關(guān)文章

  • fetch 如何請求數(shù)據(jù)

    摘要:四請求常見數(shù)據(jù)格式接下來將介紹如何使用請求本地文本數(shù)據(jù),請求本地數(shù)據(jù)以及請求網(wǎng)絡(luò)接口。請求網(wǎng)絡(luò)接口獲取中的數(shù)據(jù),做法與獲取本地的方法類似得到數(shù)據(jù)后,同樣要經(jīng)過處理 一 序言 在 傳統(tǒng)Ajax 時代,進(jìn)行 API 等網(wǎng)絡(luò)請求都是通過XMLHttpRequest或者封裝后的框架進(jìn)行網(wǎng)絡(luò)請求,然而配置和調(diào)用方式非常混亂,對于剛?cè)腴T的新手并不友好。今天我們介紹的Fetch提供了一個更好的替代方...

    MarvinZhang 評論0 收藏0
  • fetch 如何請求數(shù)據(jù)

    摘要:四請求常見數(shù)據(jù)格式接下來將介紹如何使用請求本地文本數(shù)據(jù),請求本地數(shù)據(jù)以及請求網(wǎng)絡(luò)接口。請求網(wǎng)絡(luò)接口獲取中的數(shù)據(jù),做法與獲取本地的方法類似得到數(shù)據(jù)后,同樣要經(jīng)過處理 一 序言 在 傳統(tǒng)Ajax 時代,進(jìn)行 API 等網(wǎng)絡(luò)請求都是通過XMLHttpRequest或者封裝后的框架進(jìn)行網(wǎng)絡(luò)請求,然而配置和調(diào)用方式非?;靵y,對于剛?cè)腴T的新手并不友好。今天我們介紹的Fetch提供了一個更好的替代方...

    Betta 評論0 收藏0
  • fetch 如何請求數(shù)據(jù)

    摘要:四請求常見數(shù)據(jù)格式接下來將介紹如何使用請求本地文本數(shù)據(jù),請求本地數(shù)據(jù)以及請求網(wǎng)絡(luò)接口。請求網(wǎng)絡(luò)接口獲取中的數(shù)據(jù),做法與獲取本地的方法類似得到數(shù)據(jù)后,同樣要經(jīng)過處理 一 序言 在 傳統(tǒng)Ajax 時代,進(jìn)行 API 等網(wǎng)絡(luò)請求都是通過XMLHttpRequest或者封裝后的框架進(jìn)行網(wǎng)絡(luò)請求,然而配置和調(diào)用方式非?;靵y,對于剛?cè)腴T的新手并不友好。今天我們介紹的Fetch提供了一個更好的替代方...

    jzman 評論0 收藏0
  • Ajax知識體系大梳理

    摘要:導(dǎo)讀全稱即異步與它最早在中被使用然后由推廣開來典型的代表應(yīng)用有以及現(xiàn)代網(wǎng)頁中幾乎無不歡前后端分離也正是建立在異步通信的基礎(chǔ)之上瀏覽器為做了什么現(xiàn)代瀏覽器中雖然幾乎全部支持但它們的技術(shù)方案卻分為兩種標(biāo)準(zhǔn)瀏覽器通過對象實(shí)現(xiàn)了的功能只需要通過一行 導(dǎo)讀 Ajax 全稱 Asynchronous JavaScript and XML, 即異步JS與XML. 它最早在IE5中被使用, 然后由Mo...

    Aomine 評論0 收藏0
  • ajax請求相關(guān)

    摘要:因?yàn)檎埱笫钱惒降?,我們無法獲知請求的進(jìn)度和響應(yīng)狀態(tài),給我們提供了一個事件,我們可以通過監(jiān)聽這個時間來關(guān)注這種變化,所以下一步是注冊事件。請求還沒有被發(fā)送。方法已調(diào)用,請求已發(fā)送到服務(wù)器。到此,請求準(zhǔn)備完全完成。 上一篇單獨(dú)寫的是ajax跨域,這一篇就來詳細(xì)說一說ajax,ajax是現(xiàn)代web開發(fā)中必不可少的一部分內(nèi)容,非?;A(chǔ)也非常重要,這篇總結(jié)一下到目前為止我對ajax的理解。 什么...

    h9911 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<