Fetch API
Fetch API
Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局
fetch()
方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。
fetch()
用于发起获取资源的请求。它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象。
1 |
|
同步方式接收响应
1 |
|
- await 关键字必须在一个标记了 async 的 function 内来使用
案例
前面的部分
1 |
|
同步接收数据,并写到html表单里
1 |
|
异步方式接收响应
通过.then来异步接收响应
1 |
|
跨域问题
同源检查是浏览器的行为,而且只针对 fetch、xhr(XMLHTTPRequest) 请求
只要协议、主机、端口之一不同,就不同源
- fetch 请求跨域,会携带一个 Origin 头,代表【发请求的资源源自何处】,目标通过它就能辨别是否发生跨域
- 目标资源通过返回 Access-Control-Allow-Origin 头,告诉浏览器【允许哪些源使用此响应】
通过添加响应头解决
java后端添加注解CrossOrigin来添加 Access-Control-Allow-Origin响应头
1
2
3
4
5@GetMapping("/api/students")
@CrossOrigin("http://localhost:7070")
public R all() {
return R.ok(studentService.findAll());
}也可以通过配置类配置全局跨域
实现WebMvcConfigurer的addCorsMappings方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("http://localhost:8080")
// 是否允许携带cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许的时间
.maxAge(3600);
}
}
通过代理解决
浏览器要访问跨域的资源时,将请求发到前端的代理中,让代理去获得资源再返回
安装
1
npm install http-proxy-middleware --save-dev
在启动代码中导入
1
2
3
4import {createProxyMiddleware} from 'http-proxy-middleware'
//创建代理中间件,请求url为'/api'的都会被代理
app.use('/api', createProxyMiddleware({ target: 'http://localhost:8080', changeOrigin: true }));
Fetch API
http://xwww12.github.io/2022/10/04/前端/api/FetchAPI/