1. 程式人生 > >Vue mock & vue-resource & JSONP

Vue mock & vue-resource & JSONP

前提

為什麼要運用Mock模擬資料?直接將資料放在data內部不就可以了嗎?這樣顯得資料過多,後期不利於維護。

直接在某個資料夾下建立json檔案模擬,不就可以了嗎?但是你還要計算url相對於某個檔案,好像也挺麻煩的。

相當而言我更喜歡mock..

入門

  1. 在src目錄下建立一個mock資料夾,在該資料夾內部建立相關的data.json檔案。
  2. 在build配置資料夾下找到dev-server.js檔案,在內部引入你的json檔案,可以按照相關的資料進行分類。
  3. 再找到var app = express()這一行,定義一個介面api
  4. 介面連線json資料
  5. 最後根元件連線該介面api

看文字肯定很難理解的啦,以下根據圖來講解。

步驟一、
這裡寫圖片描述

模擬的json檔案..
這裡寫圖片描述

步驟二、
這裡寫圖片描述

步驟三、
這裡寫圖片描述

步驟四、
這裡寫圖片描述

步驟五、
這裡寫圖片描述

步驟六、
這樣就完成啦,開啟localhost:port/people/suoz,輸出這樣的資料
這裡寫圖片描述

注:如果你需要格式化資料看得更方便點,chrome有一個jsonview外掛可以幫助你。

注:如果你想分為localhost:port/student/suoz 與 localhost:port/teacher/lisi。那麼你需要分別設定兩個apiRouter,在通過app.use(‘/student’,apiRouter1)、app.use(‘teacher’, apiRouter2)即可實現啦。

參考文章

Vue-Resource

越來越多的資料格式是json格式,而且在jquery框架裡面有個ajax可以實現前後端資料的傳輸。
在vue內部也提供了一個類似的外掛,並且api更加簡潔易用,壓縮後體積更小。

一般可以放在created()鉤子函式中使用

安裝

npm install vue-resource  

步驟

  1. 引入vue-resource
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
  1. 在某個元件內部created鉤子函式內部進行資料的獲取
...
created () {
    this.$http.get('/people/suoz').then((response) => {
        console.log(response.data);
    }, () => {
        console.log('error');
    });
} 
...

注:這裡的this指向Vue例項,而且也不止是get方法,還有post等方法。
注:這裡獲取的是使用mock獲取資料,所以url是/people/suoz


this.$http.get(url,[options]).then(successCallback,errorCallback)

options:傳遞給後端的資料
successCallback:成功執行的回撥函式(可以使用箭頭函式)
errorCallback:失敗執行的回撥函式(可以使用箭頭函式)

參考文章

axios

其實與vue-resource使用方法差不多,都需要安裝,引入,相關資料的獲取。後期運用到會補充。

axios.get(url,{
    params: {
        //[可選] 相關引數
    },
    headers: {
        //[可選] 修改HTTP resquest欄位
    }
}).then((response) => {
    //成功回撥函式
}).catch((error) => {
    //失敗回撥函式
});

注:可以通過第二個引數物件內部新增header鍵,對HTTP請求欄位進行修改。

相關介紹

JSONP

這裡我就不多說了..如果不瞭解跨域 & jsonp原理請自行百度吧..

前提

npm install jsonp --save-dev

Jsonp封裝函式

//jsonp.js

import originJsonp from 'jsonp';

//Jsonp封裝函式
export default function jsonp(url, data, option){
    if((url.indexOf('?') < 0)){
        url += '?' + param(data);
    }else{
        url += '&' + param(data);
    }
    return new Promise((resolve, reject) => {
        originJsonp(url, option, (err, data) => {
            if(!err){
                resolve(data);
            }else{
                reject(err);
            }
        });
    });
}

//傳進來的data物件 => &key1=value1&key2=value2...
export function param(data){
    let url = '';
    for(let i in data){
        let value = data[i];
        url += '&' + i + '=' + encodeURIComponent(value);
    }
    return url ? url.substring(1) : ''; 
}
//使用jsonp獲取資料
import {commonParam} from 'config.js';
import jsonp from 'jsonp.js';

...
mounted () {
    let url = 'XXX';
    let data = Object.assign({}, commonParam, {
        'ownName': 'suoz',
        'ownAge': 20
    });
    jsonp(url,data,'jsonpCallBack').then((response) => {
        var obj = response.data;
        this.data = obj;
    });
}
...

後端介面代理

以前學過http協議,如果想請求一個外部網站的資料,但是它指定了特定Referer和Host,導致無法獲取資料,這時候怎麼辦呢?

嘻嘻,其實也是有辦法的,前端是無法更改Referer和Host發起HTTP請求,可以通過後端代理的方式修改。

這裡寫圖片描述

假設這裡的Host: XXXX,而不是localhost:8080、Referer: XXXX,也不是localhost:8080。

  1. 進入build目錄,開啟dev-serve.js檔案。
  2. 再找到var app = express()這一行,定義一個介面api
  3. 在api內部定義一個axios.get()方法,進行相關的http請求欄位修改,並通過res.query把使用者自定義的引數傳入給伺服器。
  4. axios返回的伺服器端資料在成功函式內部返回給自己的伺服器res.json(response.data)
  5. 通過ajax傳送的請求url為定義介面時的url,這時候可以獲取到資料啦。

講得自己都混亂了…

注:這裡假設獲取資料
url:http://data.com
Host: data.com
Referer: data.com

步驟

一、

npm install axios --save-dev

二、進入build目錄,開啟dev-serve.js檔案,再引入axios

var axios = require('axios');

注:這裡不是通過import引入,而是通過require…


三、再找到var app = express()這一行,定義一個介面api

//dev-serve.js
...

var apiRouter = express.Router();

apiRouter.get('/getData',(req,res) => {
    axios.get('http://data.com',{
        headers: {
            Host: 'data.com',
            Referer: 'data.com'
        },
        pramas: req.query()
    }).then((response) => {
        //將外部獲取的資料返回給本伺服器
        res.json(response.data);    
    }).catch((error) => {
        console.log(error);
    });
});

app.use('/api', apiRouter);

四、本地也傳送一個ajax請求 url為/api/getData

//公共的引數放在config.js檔案下
import {CommonParams} from 'config.js';

//任何一個想獲取資料的元件
...
created () {
    //自定義的引數
    let OwnParamas = {
        'format': 'json',
        'name': 'suoz'
    };
    axios.get('/api/getData',{
        params: {
            CommonParams,
            OwnParams
        }
    }).then((response) => {
        let obj = response.data;
        console.log(obj);
    })
}
...

總結

必須在build資料夾下的dev-serve.js檔案下定義一個介面,然後通過axios傳送修改過欄位的HTTP請求給網路伺服器端,獲取資料後在將資料返回給本地伺服器。本地在進行ajax請求訪問定義好的介面路徑,從而獲取介面返回的資料(最關鍵的一點就是params: res.queryres.json(response.data))。