react項目本地跨域(webpack+axios)

react項目本地跨域(webpack+axios)

react項目本地跨域(webpack+axios)

遇到一個需求:要去訪問內網裏另一個域名的後端接口,比如https://www.aaa.com的域名去訪問http://www.bbb.com。

一開始是這樣寫的

  axios({
    method: 'GET',
    url: 'http://www.bbb.com/user/xiaoming',
    data: {
      StaffSn: '4927493',
    },
  }).then((result) => {
    // 返回的結果
  }).catch((err) => {
    // 出錯了
  });

然後瀏覽器報錯 :Mixed Content: The page at https://www.aaa.com’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://www.bbb.com/user/xiaoming’. This request has been blocked; the content must be served over HTTPS.
報錯的原因是:https網站去訪問http網站,是不允許,被認爲不安全的。
搜了一下解決方法,網上推薦最多的解決方法是
在頁面中加入 meta 頭:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />

或者

在我們服務器的響應頭中加入:

header("Content-Security-Policy: upgrade-insecure-requests");

就是讓瀏覽器自動升級請求,比如我們的頁面是 https 的,當頁面加載 http 開頭的資源時,自動替換成 https 請求。

但是!!上面的兩種方法是有侷限性的呀阿喂!
如果 http://www.bbb.com 本身 都不支持https。還有什麼用?

所以,,一番搜索以後,用了一個比較 靠譜😁 的方法(雖然過程中也遇到了坑),

使用webpack.devServer的proxy 配置
上代碼:
/webpack.config.js

devServer: {
	    proxy: {
		      '/apiTrans': {
			        target: 'http://www.bbb.com',
			        pathRewrite: { '^/apiTrans': '' },
			        changeOrigin: true,
			        secure: false,
	      		},
	      	},
	     },

前端請求數據的頁面這麼寫:

   axios({
    method: 'GET',
    url: '/apiTrans/user/xiaoming',
    data: {
      StaffSn: '4927493',
    },
  }).then((result) => {
    window.console.log('請求到了結果---', result);
  }).catch((err) => {
    window.console.log('err---', err);
  });

像上面這樣寫好以後,重新npm run start,跑一下webpack.config.js這個文件。

本以爲這樣就能跨域訪問到數據了,結果
中途遇到一個坑。

因爲瀏覽器Network控制檯報錯:
Request URL: https://127.0.0.1:8080/apiTrans/user/xiaoming

Cannot GET /apiTrans/user/xiaoming

原因是/webpack.config.js這個文件裏,已經在devServer.proxy裏面配置了 “/api”(我不知道里面有同事寫的這個/api匹配攔截)
碰巧的是我寫的"/apiTrans"和同事寫的"/api"都是api開頭,又碰巧的是他寫的這個在我上面(我是在proxy配置的最下面寫的),所以webpack去讀取devServer.proxy的時候,會按照順序從上往下依次匹配,所以遇到我以apiTrans開頭的請求接口,就會去走同事寫的那個"/api"配置。而不是走我"/apiTrans"的配置。所以就報錯嘍~
錯誤❌的代碼如下:

devServer: {
		proxy: {
	      "/api": {
	       	 	target: "http://localhost:8085",
	       		onProxyReq: function (proxyReq, req, res) {
	        	proxyReq.setHeader('x-forwarded-for', req.connection.remoteAddress);
	       }'/apiTrans': {
			    target: 'http://www.bbb.com',
			    pathRewrite: { '^/apiTrans': '' },
			    changeOrigin: true,
			    secure: false,
	      	},
	    }
}

正確🙋‍♂️的代碼如下:(改一下apiTrans這個匹配頭就好了)

devServer: {
		proxy: {
	      "/api": {
	       	 	target: "http://localhost:8085",
	       		onProxyReq: function (proxyReq, req, res) {
	        	proxyReq.setHeader('x-forwarded-for', req.connection.remoteAddress);
	       }'/userTrans': {
			    target: 'http://www.bbb.com',
			    pathRewrite: { '^/userTrans': '' },
			    changeOrigin: true,
			    secure: false,
	      	},
	    }
}

再npm run start ,再跑一次代碼。
發現這個跨域請求成功嘍!
出現
Request URL: https://127.0.0.1:8080/appp/json/reply/GetPsStaffProfile
Request Method: GET
Status Code: 200 OK

大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章