vue 獲取後端資料

proxy 解決請求出錯問題

vue 獲取後端資料

為什麼會出現跨域問題?

瀏覽器的同源策略

首先給出瀏覽器“同源策略”的一種經典定義,同源策略限制了來自不同源(相對於當前頁面而言)的document或script,對當前document的某些屬性進行讀取或是設定,舉例來說,A網站(www。aaa。com)上有某個指令碼,在B網站(www。bbb。com)未曾載入該指令碼時,該指令碼不能讀取或是修改B網站的DOM節點資料。

本地測試解決請求辦法

vue 獲取後端資料

vite

程式碼演示

vue 獲取後端資料

vite.config.js

import { defineConfig } from ‘vite’import vue from ‘@vitejs/plugin-vue’// https://vitejs。dev/config/export default defineConfig({ plugins: [vue()], //中轉伺服器 server:{ //透過代理實現跨域 http://localhost:20219 proxy:{ ‘/api’:{ //替換的伺服器地址 target: ‘http://localhost:20219’, //開啟代理 允許跨域 changeOrigin: true, //設定重寫的路徑 rewrite: (path) => path。replace(/^\/api/, “”), } } }})

執行結果

vue 獲取後端資料

Vue CLI

程式碼演示

vue 獲取後端資料

vue。config。js

const { defineConfig } = require(‘@vue/cli-service’)module。exports = defineConfig({ transpileDependencies: true, devServer: { //透過代理實現跨域 proxy: { ‘/path’:{ //替換的伺服器地址 target: ‘https://localhost/prod-api’, //開啟代理 允許跨域 changeOrigin: true, //設定重寫的路徑 pathRewrite:{ ‘^/path’:‘’ } } } }})

執行結果

vue 獲取後端資料

fetch

Fetch API 提供了一個獲取資源的介面(包括跨域請求)。任何使用過 XMLHttpRequest 所有人都能輕鬆上手,而且新的 API 提供了更強大和靈活的功能集。

優點:

1。 語法簡潔,更加語義化

2。 基於標準 Promise 實現,支援 async/await

3。 同構方便,更加底層,提供的API豐富(request, response, body , headers)

4。 脫離了XHR,是ES規範裡新的實現方式複製程式碼

缺點:

1。 fetch只對網路請求報錯,對400,500都當做成功的請求,伺服器返回 400,500 錯誤碼時並不會 reject。

2。 fetch預設不會帶cookie,需要新增配置項: credentials: ‘include’。

3。 fetch不支援abort,不支援超時控制,造成了流量的浪費。

4。 fetch沒有辦法原生監測請求的進度,而XHR可以

程式碼演示

Post請求

後端介面展示

vue 獲取後端資料

user.vue

執行效果

編輯Get請求

後端介面展示

vue 獲取後端資料

user.vue

執行結果

vue 獲取後端資料

Axios

官網:Axios API | Axios 中文文件 | Axios 中文網 (axios-http。cn)

Axios 是一個基於

promise

網路請求庫,作用於node。js 和瀏覽器中。 它是

isomorphic

的(即同一套程式碼可以執行在瀏覽器和node。js中)。在服務端它使用原生 node。js http 模組, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests。

axios優點:

支援node端和瀏覽器端 支援 Promise 豐富的配置項

安裝

使用 npm:

$ npm install axios

檢視是否安裝成功

vue 獲取後端資料

程式碼演示

Post請求

後端介面演示

vue 獲取後端資料

User.vue

執行結果

vue 獲取後端資料

Get請求

後端介面演示

vue 獲取後端資料

User.vue

執行結果

vue 獲取後端資料

TS 封裝Axios

vue 獲取後端資料

程式碼演示

request index.ts

import axios from “axios”;//建立axios例項const service=axios。create({ //url開頭 baseURL:“path”, timeout: 5000, //請求頭配置 headers:{ “Content-Type”: “application/json; charset=utf-8” }})//請求攔截service。interceptors。request。use((config)=>{ //請求頭放token config。headers=config。headers || {} if(localStorage。getItem(‘token’)){ config。headers。Authorization=localStorage。getItem(‘token’) || “” } return config;})//響應攔截 service。interceptors。response。use((res)=>{ const code:number=res。data。code // 如果響應code不為200攔截掉 if(code!=200){ return Promise。reject(res。data) } return res。data;},(err)=>{ // 列印錯誤請求 console。log(err);})export default service

request api.ts

import service from “。”;//登入介面interface LoginData{ userTelephone:string, userPassword:string}export function login(data:LoginData){ return service({ url:“/user/userLoginByPassword”, method: “post”, data })}

LoginView.vue

部分使用程式碼 想看=>完整版(登入功能實現)

//呼叫登入介面 login(data。ruleForm)。then((res) => { console。log(res) localStorage。setItem(“token”, res。data。token); router。push(“/”); });

demo案例

感興趣的可以瞭解瞭解(附原始碼)

vue 獲取後端資料