2020-04-13--Vue之前后端交互4--fetch

fetch

  • Fetch API是新的ajax解決方案 Fetch會返回Promise
  • fetch不是ajax的進(jìn)一步封裝蔬啡,而是原生js,沒有使用XMLHttpRequest對象血久。
  • fetch(url, options).then()
  • url:就是訪問的url地址
  • options:JSON格式,包含:訪問時的方式帮非,請求頭(json格式)氧吐,請求體等
  • fetch(url, options)返回Promise對象

fetch基本使用:
格式:
fetch('url')
.then(函數(shù):返回Promise對象)
.then(函數(shù):數(shù)據(jù))

<script type="text/javascript">
    /*
      Fetch API 基本用法
          fetch(url).then()
         第一個參數(shù)請求的路徑   Fetch會返回Promise   所以我們可以使用then 拿到請求成功的結(jié)果 
    */
    fetch('http://localhost:3000/fdata').then(function(data){
      // text()方法屬于fetchAPI的一部分,它返回一個Promise實(shí)例對象末盔,用于獲取后臺返回的數(shù)據(jù)
      return data.text();
    }).then(function(data){
      //   在這個then里面我們能拿到最終的數(shù)據(jù)  
      console.log(data);
    })
  </script>
<script>
        fetch('http://127.0.0.1:5000/get_category').then(function(data){
            console.log(data)       //Reponse請求內(nèi)容
            return data.text()        //返回一個promise對象然后.then,進(jìn)行處理
            }).then(function(data){
                console.log('thenthen')      
                console.log(data)  //輸出服務(wù)器返回的內(nèi)容
            })
    </script>

fetchAPI中的http請求

  • HTTP協(xié)議筑舅,它給我們提供了很多的方法,如POST庄岖,GET豁翎,DELETE,UPDATE隅忿,PATCH和PUT
  • 默認(rèn)是get請求
  • 當(dāng)請求方法不是get時心剥,需要在 options 對象中 指定對應(yīng)的 method - method:請求使用的方法
  • post 和 普通 請求的時候 需要在options 中 設(shè)置 請求頭 headers 和 body
    delete請求:
fetch('http://localhost:5000/books/789', {
        method: 'delete'
    })
        .then(function(data) {
            return data.text();
        }).then(function(data) {
        console.log(data)
    });

put請求與delete一致,不做解釋背桐。

POST請求

那么重點(diǎn)說post請求优烧,有兩種方式,不同的地方就是options中的body的格式和header不同:

  • 字符串格式
  • JSON格式

post請求(1)(發(fā)送form表單的字符串字符串格式)

在vscode中新建html文件:

<script>
        fetch('http://localhost:5000/add_person', {
        method: 'post',
        body: 'username=lisi&age=123',
        headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
        }
    })
    .then(function(data) {
        return data.text();
    }).then(function(data) {
        console.log(data)
    });
    </script>

后端代碼

@app.route('/add_person',methods=['POST'])
def add_person():
    username = request.form['username']
    age = request.form['age']
    return username+':'+age

結(jié)果


post請求(2)(json格式)

    <script>
        let person = {
            username:'zhangsan',
            age:33
        }
        fetch('http://localhost:5000/add_personJson', {
            method: 'post',
            body: JSON.stringify(person),        //把json對象轉(zhuǎn)化為字符串類型(前后端數(shù)據(jù)交互都是以字符串形式)
            headers: {'Content-Type': 'application/json'}
        })
        .then(function(data) {
            return data.text();
        })
        .then(function(data) {
            console.log(data)
    });
    </script>

后端代碼

@app.route('/add_personJson',methods=['POST'])
def add_personjson():
    jsonobj = request.json
    return jsonobj['username']+':'+str(jsonobj['age'])

結(jié)果:


restful請求

不再是請求的url上id.后綴链峭,而是直接輸入id畦娄,在后臺進(jìn)行處理.
在url后加上id例如:

http://localhost:5000/add_personJson/123

123就是id
在服務(wù)器端的app路由中加上

@app.route('/add_personJson/<string:pid>',methods=['POST'])
def add_personJson(pid)
        #對pid進(jìn)行操作

得到的pid就是訪問url時傳遞的參數(shù),通過這個參數(shù)進(jìn)行操作。

fetchAPI 中 響應(yīng)格式

用fetch來獲取數(shù)據(jù)熙卡,如果響應(yīng)正常返回杖刷,我們首先看到的是一個response對象,其中包括返回的一堆原始字節(jié)驳癌,這些字節(jié)需要在收到后滑燃,需要我們通過調(diào)用方法將其轉(zhuǎn)換為相應(yīng)格式的數(shù)據(jù),比如JSON颓鲜,BLOB或者TEXT等等.
當(dāng)在第一個then中使用data.text()時表窘,轉(zhuǎn)為string類型,直接在第二個then方法中使用data即可甜滨,不能再調(diào)用data.uname等屬性乐严。但是可以通過JSON.parse(data)把字符串轉(zhuǎn)為JSON對象,進(jìn)行調(diào)用衣摩。
當(dāng)使用data.json()時昂验,轉(zhuǎn)為json類型,在后邊可直接使用屬性調(diào)用昭娩,如data.uname等凛篙。


    /*
      Fetch響應(yīng)結(jié)果的數(shù)據(jù)格式
    */
    fetch('http://localhost:3000/json').then(function(data){
      // return data.json();   //  將獲取到的數(shù)據(jù)使用 json 轉(zhuǎn)換對象
      return data.text(); //  //  將獲取到的數(shù)據(jù) 轉(zhuǎn)換成字符串 ,新的Promise對象
    }).then(function(data){
      #json
      console.log(data.uname,data.age,data.gender)
      #text
      console.log(data)
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載黍匾,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者栏渺。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锐涯,隨后出現(xiàn)的幾起案子磕诊,更是在濱河造成了極大的恐慌,老刑警劉巖纹腌,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霎终,死亡現(xiàn)場離奇詭異,居然都是意外死亡升薯,警方通過查閱死者的電腦和手機(jī)莱褒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涎劈,“玉大人广凸,你說我怎么就攤上這事≈朊叮” “怎么了谅海?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹦浦。 經(jīng)常有香客問我扭吁,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任侥袜,我火速辦了婚禮蝌诡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枫吧。我一直安慰自己送漠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布由蘑。 她就那樣靜靜地躺著闽寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尼酿。 梳的紋絲不亂的頭發(fā)上爷狈,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音裳擎,去河邊找鬼涎永。 笑死,一個胖子當(dāng)著我的面吹牛鹿响,可吹牛的內(nèi)容都是我干的羡微。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惶我,長吁一口氣:“原來是場噩夢啊……” “哼妈倔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绸贡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盯蝴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后听怕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捧挺,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年尿瞭,在試婚紗的時候發(fā)現(xiàn)自己被綠了闽烙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡声搁,死狀恐怖黑竞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酥艳,我是刑警寧澤摊溶,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站充石,受9級特大地震影響莫换,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一拉岁、第九天 我趴在偏房一處隱蔽的房頂上張望坷剧。 院中可真熱鬧,春花似錦喊暖、人聲如沸惫企。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狞尔。三九已至,卻和暖如春巩掺,著一層夾襖步出監(jiān)牢的瞬間偏序,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工胖替, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留研儒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓独令,卻偏偏與公主長得像端朵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子燃箭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354