前后端交互的五種方式-fetch-xhr區(qū)別

1. 前言

簡單的總結(jié)下前端的請求方式


2.服務(wù)端

服務(wù)端就選用node
任TA前端幾路來,我后端只一路去
五種請求方式的前端,后端都是一套
// express 極簡的web開發(fā)框架
const express = require('express')
var app = express()
// 靜態(tài)資源目錄,前端代碼放這里
app.use(express.static(__dirname+"/public"))
// 中間件 處理post請求參數(shù)
app.use(express.json())
app.use(express.urlencoded({extended:true}))
//get請求的登錄接口
app.get("/login",(req,res) => {
    res.json({
         code:1000,
        msg:"get-成功",
        name: req.query.name,
        psw: req.query.password
    })
})

// post請求的注冊
app.post("/register",(req,res) => {
        res.json({
           code:1000,
           msg:"post-成功",
            name: req.body.name,
            psw: req.body.password
        })
})
// jsonp
app.get("/jsonp",(req,res) => {
        res.jsonp({code:200,msg:"jsonp成功"})
})
app.listen(7788,()=>{
    console.log("7788服務(wù)啟動");
})

3.表單請求-get

    <form action="/login" method="get">
        <input type="text" name="name">
        <input type="text" name="password">
        <input type="submit" value="get">
    </form>

4. 表單請求-post

   <form action="/register" method="post">
        <input type="text" name="name">
        <input type="text" name="password">
        <input type="submit" value="post">
    </form>

5. 原生ajax-get

簡易寫法

  var xhr = new XMLHttpRequest();
            xhr.open("GET", `/login?name=${userName.value}&password=${password.value}`)
            xhr.send();
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    console.log("ajax", xhr.responseText);
                }
            }

6.原生ajax-post

var xhr = new XMLHttpRequest();
            xhr.open("POST", "/register")
//設(shè)置請求頭 等配置信息
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
            xhr.send(`name=${userName.value}&password=${password.value}`)
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    console.log(xhr.responseText)
                }
            }
      

7. jQ-get

 $.ajax({
                type: "get",
                url: "/login",
                data: { name: userName.value, password: password.value },
                success: function (response) {
                    console.log("jq-get:", response)
                }
            });
      

8.jQ-post

  $.ajax({
                type: "post",
                url: "/register",
                data: { name: userName.value, password: password.value },
                success: function (response) {
                    console.log("jq-get:", response)
                }
            });

9. axios-get

注意的就是 axiosget請求參數(shù){params:{參數(shù)}}
外面多了一層

   axios.get("/login",{params: { 
                name: userName.value, 
                password: password.value
             }})
                .then(res => {
                    console.log("axios-get",res.data)
                })
                .catch(err => {
                    console.error("axios-get-err:",err);
                })

10. axios-post

     axios.post("/register", {
                name:userName.value,
                password:password.value
            })
            .then(res => {
                console.log("axios-post",res.data)
            })
            .catch(err => {
                console.error("axios-post-err",err); 
            })

第三個參數(shù)是配置信息,不需要配置就不填
{
      headers: { "Content-Type": "application/x-www-form-urlencoded" }
}

11. fetch -get

 fetch(`/login?name=${userName.value}&password=${password.value}`).then((res) =>{
                res.json().then(data=>{
                    console.log("響應(yīng)數(shù)據(jù):",data)
                })
            })

12 fetch-post

 fetch("/register",{
                method: "POST",
                body: JSON.stringify({ 
                       name:userName.value, 
                      password:password.value
                }),
                headers: {
                    'Content-Type': 'application/json;charset=utf-8'
                }
            }).then((res) =>{
                res.json().then(data=>{
                    console.log("響應(yīng)數(shù)據(jù):",data)
                })
            })

13.jsonp

jsonp 只是解決前端跨域的一種非標(biāo)準(zhǔn)的方式,
所以 axiosfetch原生不支持 jsonp,
通常還是后端解決跨域


13.1 原生ajax實(shí)現(xiàn)

 <script>
        function  getData(res){
            console.log("Res----------:",res);
        }
 </script>
<script src="http://127.0.0.1:7788/jsonp?callback=getData"></script>

回調(diào)函數(shù)寫到 腳本標(biāo)簽的上邊
實(shí)際工作中 都是動態(tài)創(chuàng)建 script標(biāo)簽 ,拼接url參數(shù)


一般動態(tài)創(chuàng)建 script標(biāo)簽

  let showMsg = (res) => {
            console.log("jsonp 結(jié)果:", res)
        }
        let jsonpFn = () => {
            let script = document.createElement("script")
            script.src = "http://127.0.0.1:7788/jsonp?callback=showMsg"
            document.body.appendChild(script)
            //發(fā)完請求 就刪掉  避免重復(fù)創(chuàng)建 
            document.body.removeChild(script)
        }

13.2 jQ ajax實(shí)現(xiàn)

  $.ajax({
            type: "get",
            url: "http://127.0.0.1:7788/jsonp",
            data: {},
            dataType: "jsonp",
            success: function (response) {
                console.log("response:",response);
            }
        });

重點(diǎn)就是 dataType 設(shè)置為jsonp


14.fetch-xhr

工具 本質(zhì) 優(yōu)劣
原生XHR let xhr = new XMLHttpRequest() 瀏覽器支持的原生技術(shù); 基于回調(diào)方式處理響應(yīng)
jQ ajax XHR的進(jìn)一步封裝而已 比原生簡單; 基于回調(diào)方式處理響應(yīng)
Axios XHR的進(jìn)一步封裝而已 比原生簡單; 基于Promise處理響應(yīng);可以排隊(duì),并發(fā),撤銷
NG httpClient XHR的進(jìn)一步封裝而已 比原生簡單; 基于觀察者模式方式處理響應(yīng);可以排隊(duì),并發(fā),撤銷
Fetch 不再是XHR,是W3C提出的新技術(shù),希望是替代 XHR XHR從根本上更加先進(jìn);天然基于Promise;兼容性還有點(diǎn)問題

參考資料

promise封裝
fectch


初心

我所有的文章都只是基于入門,初步的了解袋励;是自己的知識體系梳理;
如果能幫助到有緣人,非常的榮幸,一切都是為了部落的崛起
共勉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市郁轻,隨后出現(xiàn)的幾起案子氮昧,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂恕,死亡現(xiàn)場離奇詭異,居然都是意外死亡弛槐,警方通過查閱死者的電腦和手機(jī)懊亡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎串,“玉大人店枣,你說我怎么就攤上這事。” “怎么了鸯两?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵闷旧,是天一觀的道長。 經(jīng)常有香客問我甩卓,道長鸠匀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任逾柿,我火速辦了婚禮缀棍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘机错。我一直安慰自己爬范,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布弱匪。 她就那樣靜靜地躺著青瀑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萧诫。 梳的紋絲不亂的頭發(fā)上斥难,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音帘饶,去河邊找鬼哑诊。 笑死,一個胖子當(dāng)著我的面吹牛及刻,可吹牛的內(nèi)容都是我干的镀裤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缴饭,長吁一口氣:“原來是場噩夢啊……” “哼暑劝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颗搂,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤担猛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峭火,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毁习,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年卖丸,在試婚紗的時候發(fā)現(xiàn)自己被綠了纺且。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡稍浆,死狀恐怖载碌,靈堂內(nèi)的尸體忽然破棺而出猜嘱,到底是詐尸還是另有隱情,我是刑警寧澤嫁艇,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布朗伶,位于F島的核電站,受9級特大地震影響步咪,放射性物質(zhì)發(fā)生泄漏论皆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一猾漫、第九天 我趴在偏房一處隱蔽的房頂上張望点晴。 院中可真熱鬧,春花似錦悯周、人聲如沸粒督。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屠橄。三九已至,卻和暖如春闰挡,著一層夾襖步出監(jiān)牢的瞬間锐墙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工长酗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贮匕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓花枫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掏膏。 傳聞我的和親對象是個殘疾皇子劳翰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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