1.前后台交互
Vue前后端交互可以通過下面兩種方式實現;
方式1:通過vue-resource中
this.$http.post('/api/sys/login/getPasskey.do',{
keytype:'SESSION_PASSKEY'
}).then(function(res){
alert(res.data);
},function(res){
alert(res.status)
});
方式2:通過axios
axios.doPost('/api/sys/login/getPasskey.do',{
keytype:'SESSION_PASSKEY'
}).then(function(res){
alert(res.data);
},function(res){
alert(res.status)
});
這件建議使用方式2;
這里對方式2進行了封裝,詳細如下:
目錄結構:
文件:代碼如下
/**
* Created by Zl on 2019/4/14.
*/
import axios from 'axios'
export default {
httpMethod: {
GET: 'get',
POST: 'post',
PUT: 'put',
DELETE: 'delete'
},
instance: axios.create({
baseURL: '/api',
timeout: 10000,
}),
/**
*
* @param url
* @param pathParams
* @param options
* @returns {*|Promise}
*/
doGet(url, pathParams = null, options = null) {
return this.doRequest(url, this.httpMethod.GET, pathParams, null, options)
},
/**
* Http Post
* @param url
* @param pathParams
* @param body
* @param options
* @returns {*|Promise}
*/
doPost(url, pathParams = null, body = null, options = null) {
return this.doRequest(url, this.httpMethod.POST, pathParams, body, options)
},
/**
* Http Put
* @param url
* @param pathParams
* @param body
* @param options
* @returns {*|Promise}
*/
doPut(url, pathParams = null, body = null, options = null) {
return this.doRequest(url, this.httpMethod.PUT, pathParams, body, options)
},
/**
* Http Delete
* @param url
* @param pathParams
* @param options
* @returns {*|Promise}
*/
doDelete(url, pathParams = null, options = null) {
return this.doRequest(url, this.httpMethod.DELETE, pathParams, null, options)
},
/**
* Http Request
* @param url
* @param method
* @param pathParams
* @param body
* @param options
* @returns {Promise}
*/
doRequest(url, method, pathParams, body, options) {
let wrapURL = this._wrapUrl(url, pathParams)
let request = null
switch (method) {
case this.httpMethod.GET: {
if (options !== null) {
request = this.instance.get(wrapURL, {params: options})
} else {
request = this.instance.get(wrapURL)
}
break
}
case this.httpMethod.POST: {
request = this.instance.post(wrapURL, body, options)
break
}
case this.httpMethod.PUT: {
request = this.instance.put(wrapURL, body, options)
break
}
case this.httpMethod.DELETE: {
request = this.instance.delete(wrapURL, options)
break
}
}
return this._requestPromise(request)
},
/**
* Request Promise
* @param request {Promise} Axios Http Promise
* @returns {Promise}
* @private
*/
_requestPromise(request) {
return new Promise(function (resolve, reject) {
request.then(response => {
if (response.data.status === 0) {
resolve(response.data)
} else {
reject(response.data.message)
}
}, error => {
reject(error)
})
})
},
/**
* 從URL匹配出參數pathParams
* @param {string} url
* @param {object} params
* @returns {string}
* @private
*/
_wrapUrl(url, params) {
if (params !== null) {
let matches = this._getMatches(url)
for (let match of matches) {
let value = params[match.replace(':', '')]
if (value !== null) {
url = url.replace(match, value)
}
}
}
return url
},
/**
* 正則Group匹配
* @param {string} string
* @returns {Array}
* @private
*/
_getMatches(string) {
let matches = []
let regex = /(:[a-z_A-Z]+)/
let match = regex.exec(string)
while (match !== null) {
matches.push(match[1])
string = string.replace(match[1], '')
match = regex.exec(string)
}
return matches
}
}
使用方式:

2.配置轉發
通過前端用的服務域名和端口和后台並不是同一個,比如前端是localhost:4200,后端是localhost:8080,這時候需要將前端的請求到8080上,這時候就需要使用轉發;配置如下:

proxyTable: {
'/api': {
target: 'http://localhost:8089', // 接口的域名
// secure: false, // 如果是https接口,需要配置這個參數
changeOrigin: false, // 如果接口跨域,需要進行這個參數配置,為true的話,請求的header將會設置為匹配目標服務器的規則(Access-Control-Allow-Origin)
pathRewrite: {
'^/api': '' //本身的接口地址沒有 '/api' 這種通用前綴,所以要rewrite,如果本身有則去掉
}
}
},
即對所有以api開頭的請求進行轉發到localhost:8089上,同時去掉api前綴;
轉發前請求路徑:localhost:4209/api/sys/admin/getPassKey.do;配置后路徑:localhost:8089/sys/admin/getPassKey.do
