由于瀏覽器的同源策略(Same-Origin Policy),在默認狀態下,JavaScript 只能訪問與其所在頁面有相同協議(protocol),主機(host)和端口號(port)的文檔的屬性和方法。因此,如果我們想讓 JavaScript 訪問具備不同 URL 的資源,就必須解決跨域問題。
跨域指的是一個域名訪問另一個域名下的資源,為了解決這個問題,我們可以通過在服務器端進行設置,讓目標站點的資源允許被其他站點獲取到,或者使用 JSONP(JSON with Padding)技術,或者通過代理來實現跨域訪問。
VUE 是由 Evan You 開發的一個前端框架,它對 MVVM 架構模式進行了優化和改進,讓開發者更加便捷和快速地構建一個高性能、易維護的 Web 應用程序。VUE 是一個輕量級的框架,提供了很多高效、靈活且易于使用的 API,其中之一就是用于解決跨域訪問問題的 axios 庫。
Axios 是一個基于 Promise 的 HTTP 客戶端,它可用于瀏覽器和 Node.js 環境中對 HTTP 請求進行管理。Axios 可以幫助我們發送異步 HTTP 請求,從而獲取響應數據,并將這些數據顯示在 Web 頁面上。而且,Axios 支持 PromiseAPI、攔截請求和響應、轉換數據、取消請求等特性。
我們可以在 main.js 文件中進行全局配置,比如設置我們要訪問的域名地址和端口號:
import axios from 'axios' axios.defaults.baseURL = 'http://domain.com' // 地址 axios.defaults.port = 3000 // 端口號 Vue.prototype.$axios = axios
通過在 Vue 原型上綁定 Axios,我們可以在組件內部使用 this.$axios.get() 或 this.$axios.post() 等方法來訪問不同域的資源。例如,我們若要訪問 http://api.domain.com/users ,直接使用以下代碼即可:
async mounted() { const { data } = await this.$axios.get('/users') // 獲取數據并解構結果 console.log(data) // 輸出獲取的數據 }
在以上代碼中,我們使用了 async-await 的方法來獲取 Axios 請求結果,并通過 console.log() 函數將結果打印到控制臺。
在許多情況下,使用axios庫可以很容易解決跨域問題。但在一些特殊情況下,如請求轉發時需要修改請求頭、設置跨域 Cookie、使用 WebSocket 等,我們需要更加細致地進行跨域操作。
一個比較好的解決方法是使用代理。代理服務器作為中間人在客戶端和服務器之間傳遞請求和響應,它可以幫助我們在不同域名的請求之間建立一條通道,從而實現跨域訪問。
我們可以使用 WebpackDevServer 提供的相關配置來代理向后臺 REST API 的請求。以下是一個簡單的例子,其中所有以 /api 開頭的請求都會被代理到目標地址 http://api.domain.com/ 上:
devServer: { proxy: { '/api': { target: 'http://api.domain.com/', changeOrigin: true, pathRewrite: { '^/api': '' } } } }
在以上的代碼中,target 值為實際的 API 服務器地址,changeOrigin 為 true 表示開啟跨域,pathRewrite 用來重寫地址,這里將/API 地址重寫為空,相當于刪除了API 的前綴。
通過以上方式,我們就可以使用 Vue 構建完整的 Web 應用程序,并對不同域名的數據進行獲取和訪問。