Skip to content

fetch api

  • ajax 是基于XMLHttpRequest 实现的, fetch 是基于 promise 原生 api
  • axios 是一个基于 Promise 的 HTTP 客户端,但它底层使用了 XMLHttpRequest
js
fetch("http://example.com/movies.json")
  .then((response) => response.json())
  .then((data) => console.log(data));

Fetch 比起 Axios 来讲几乎没有任何优势(除了浏览器原生支持) Fetch 是原生的 API, 并不是对 XMLHttpRequest 的封装, 类比 xhr Axios 是对 XMLHttpRequest 的封装, 是一个第三方库

语法

https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API

js
fetch(input,[init]);
// input——定义要获取的资源,可以是:
//  一个 USVString 字符串,包含要获取资源的 URL。
//  一个 Request 对象。

// init—— 可选 | 一个配置项对象,包括所有对请求的设置。可选的参数有:
var myInit={
    //请求的 body 信息 //如:Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象
    body: JSON.stringify(data), //这里必须匹配 'Content-Type' //注意 GET 或 HEAD 方法的请求不能包含 body 信息。 
   
    //请求的 cache 模式。//如:default, no-cache, reload, force-cache, only-if-cached
    cache: 'no-cache', 	 
    
    //请求的 credentials。//包括:omit、same-origin,include(允许跨域请求时携带 cookie)
    credentials: 'same-origin',  
      
    //请求的头信息
    headers: {	
      'user-agent': 'Mozilla/4.0 MDN Example',
      'content-type': 'application/json'
    },
      
    //请求使用的方法  //如:GET, POST, PUT, DELETE等
    method: 'POST', 
    
    //请求的模式	 //如 cors、 no-cors 或者 same-origin。
    mode: 'cors', 
      
    //重定向模式 //如 follow|自动重定向, error|如果产生重定向将自动终止并且抛出一个错误, manual|手动处理重定向
    redirect: 'follow', 
    
    //USVString  //如 no-referrer、client或一个 URL。默认是 client
    referrer: 'no-referrer',
}

get

js
fetch('http://example.com/movies.json')	
  .then(response => response.json())
  .then(data => console.log(data));
js
// 发请求获取学生信息
/**
 * fetch(): ajax的升级版
 *  参数: 1. 请求地址
 *        2. 请求信息
 * */
fetch(URL + '/api/students')
  .then(res => {
	console.log('res', res)
	// res.json(): 把响应的json对象转换成js对象, 也是返回promise
	if (res.statusText == 'OK') {
	  res.json()
	} else {
	  throw new Error('数据加载失败')
	  console.log(res.status + ' ' + res.statusText)
	}
  })
  .then(data => {
    console.log('data', data)
  })
  .catch(err => {
  	console.log(err)
  })

使用 async await

js
// 获取学生列表
const fetchStuList = useCallback(async () => {
  try {
    setLoading(true)
    setError(null)
    const res = await fetch(URL + '/api/students')
    if (res.statusText === 'OK') {
      const data = await res.json()
      studentsPatch({ type: 'init', data: data.data })
    } else {
      throw new Error('数据加载失败')
    }
  } catch (error) {
    setError(error.message)
  } finally {
    setLoading(false)
  }
}, [])

// 组件渲染完成后只执行一次
useEffect(() => {
  fetchStuList()
}, [])

post

js
var data={
    id:'1',
}
fetch('http://example.com/api',{
    method:'POST',
    headers: {
      'Content-Type': 'application/json'
  	},
    body:JSON.stringify(data)
})	
.then(response => response.json())
.then(data => console.log(data));

delete

js
fetch('http://example.com/movies.json',{
  method: 'DELETE'
})	
  .then(response => response.json())

表单

js
const formData = new FormData();  
formData.append('username''John');  
formData.append('email''[email protected]');  
  
fetch('https://example.com/api/form', {  
    method: 'POST',  
    body: formData  
})  
.then(response => response.text())  
.then(data => console.log(data))  
.catch(error => console.error('Error:', error));