react与后端交互(包括通过axios进行跨域访问)(React interacts with the backend (including cross domain access via Axios))-react
react与后端交互(包括通过axios进行跨域访问)(React interacts with the backend (including cross domain access via Axios))
方式一 本地访问
将react的build包直接放在SpringBoot项目的WebApp下,可以直接通过相对路径进行访问。
方式二 跨域访问-服务器端开放跨域
以Servlet为例,response配置为允许跨域。
response.setHeader(“Access-Control-Allow-Origin”, “*”); //参数*代表可访问的地址或域名,* 代表不限制客户端,可以”127.0.0.1″或”www.baidu.com”。
package com.example.demo.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HellowServlet2
*/
@WebServlet("/HellowServlet2")
public class HellowServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HellowServlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("getParameter: " + request.getParameter("id"));
System.out.println("getParameterMap: " + request.getParameterValues("books"));
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
//response.setContentType("application/json");
response.setContentType("application/x-www-form-urlencoded");
response.getWriter().println("{\"name\":\"lance\",\"id\":\"44\"}"); //JSONUtil.parse(CommonResult.forbidden(e.getMessage()))
response.getWriter().flush();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
客户端访问,使用axios
axios.request({
headers:{ //非必须
"Content-Type":"application/x-www-form-urlencoded"
},
url:Url,
params:Params//, //参数类型二
//withCredentials: true//跨域设置,不可用
})
.then(function (response) {
let data =response.data
console.log(data.name);
ts.getData(data.name);
})
// .then(aaa => this.setState({ //在axios中setState方法二
// argName:aaa.data.name
// }))
.catch(function (error) {
console.log(error);
});
getData(newName){
this.setState({
argName: newName
});
}
方式三 跨域访问-客户端开放跨域
利用axios自带的代理服务:proxy。
"proxy": "http://127.0.0.1:8084"
package.json配置:
{
"name": "react-test",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.1.1",
"@testing-library/user-event": "^13.5.0",
"axios": "^0.27.2",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"homepage": ".",
"main": "index.html",
"proxy": "http://127.0.0.1:8084"
}
类组件调用
// let BaseURL="http://127.0.0.1:8084"
let BaseURL="/api" //默认proxy代理的接口
let Url="/HellowServlet2"
// let Books = ['aaa','bbb'];
let Params= {
"id" : "3",
"name": "ll",
"age": "18"
}
//axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded";
//全局配置baseURL[URL三个字母必须大写,不然axios不认]
let ts = this;//在axios中setState方法一
axios.request({
headers:{ //非必须
"Content-Type":"application/x-www-form-urlencoded"//,
// "Access-Control-Allow-Origin":"http://127.0.0.1", //不可用
// "Access-Control-Allow-Credentials": "true"//不可用
},
// method: 'get', //非必须
//baseURL:BaseURL,//使用proxy时,无需配置
url:Url,
// data:Qs.stringify(Params), //参数类型一
params:Params//, //参数类型二
//withCredentials: true//跨域设置 //不可用
})
.then(function (response) {
let data =response.data
console.log(data.name);
ts.getData(data.name);
})
// .then(aaa => this.setState({ //在axios中setState方法二
// argName:aaa.data.name
// }))
.catch(function (error) {
console.log(error);
});
}
getData(newName){
this.setState({
argName: newName
});
}
< strong > method 1: local access < / strong >
Put the build package of react directly under the webapp of the springboot project, which can be accessed directly through the relative path.
< strong > mode 2 cross domain access – server side open cross domain < / strong >
Taking servlet as an example, the response is configured to allow cross domain.
response. setHeader(“Access-Control-Allow-Origin”, “*”); // The parameter * represents the accessible address or domain name, * represents the unrestricted client, which can be “127.0.0.1” or “www.baidu. Com”.
package com.example.demo.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HellowServlet2
*/
@WebServlet("/HellowServlet2")
public class HellowServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HellowServlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("getParameter: " + request.getParameter("id"));
System.out.println("getParameterMap: " + request.getParameterValues("books"));
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
//response.setContentType("application/json");
response.setContentType("application/x-www-form-urlencoded");
response.getWriter().println("{\"name\":\"lance\",\"id\":\"44\"}"); //JSONUtil.parse(CommonResult.forbidden(e.getMessage()))
response.getWriter().flush();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Client access, using Axios
axios.request({
headers:{ //非必须
"Content-Type":"application/x-www-form-urlencoded"
},
url:Url,
params:Params//, //参数类型二
//withCredentials: true//跨域设置,不可用
})
.then(function (response) {
let data =response.data
console.log(data.name);
ts.getData(data.name);
})
// .then(aaa => this.setState({ //在axios中setState方法二
// argName:aaa.data.name
// }))
.catch(function (error) {
console.log(error);
});
getData(newName){
this.setState({
argName: newName
});
}
< strong > < strong > mode 3 cross domain access – client open cross domain < / strong > < / strong >
Use the proxy service provided by Axios: proxy.
"proxy": "http://127.0.0.1:8084"
package.json配置:
{
"name": "react-test",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.1.1",
"@testing-library/user-event": "^13.5.0",
"axios": "^0.27.2",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"homepage": ".",
"main": "index.html",
"proxy": "http://127.0.0.1:8084"
}
Class component call
// let BaseURL="http://127.0.0.1:8084"
let BaseURL="/api" //默认proxy代理的接口
let Url="/HellowServlet2"
// let Books = ['aaa','bbb'];
let Params= {
"id" : "3",
"name": "ll",
"age": "18"
}
//axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded";
//全局配置baseURL[URL三个字母必须大写,不然axios不认]
let ts = this;//在axios中setState方法一
axios.request({
headers:{ //非必须
"Content-Type":"application/x-www-form-urlencoded"//,
// "Access-Control-Allow-Origin":"http://127.0.0.1", //不可用
// "Access-Control-Allow-Credentials": "true"//不可用
},
// method: 'get', //非必须
//baseURL:BaseURL,//使用proxy时,无需配置
url:Url,
// data:Qs.stringify(Params), //参数类型一
params:Params//, //参数类型二
//withCredentials: true//跨域设置 //不可用
})
.then(function (response) {
let data =response.data
console.log(data.name);
ts.getData(data.name);
})
// .then(aaa => this.setState({ //在axios中setState方法二
// argName:aaa.data.name
// }))
.catch(function (error) {
console.log(error);
});
}
getData(newName){
this.setState({
argName: newName
});
}