fetch基本使用
搭建简易的服务器:
①新建express文件夹
②终端中执行 express -e 和 npm i
③在express/routes/user.js中定义login请求路径
var express = require('express') var router = express.Router() router.get('/login', (req, res) => { let { username, password } = req.query console.log(username, password) if (username === 'admin' && password === 'admin') { res.json({ code: 200, data: 'OK' }) } else { res.json({ code: 200, data: { info: '用户名或密码错误' } }) } }) router.post('/login', (req, res) => { let { username, password } = req.body console.log(username, password) if (username === 'admin' && password === 'admin') { res.json({ code: 200, data: 'OK' }) } else { res.json({ code: 200, data: { info: '用户名或密码错误' } }) } }) module.exports = router
④dev.config.js中配置跨域代理

⑤package.json中用supervisor替换原来的node,重启服务:npm start
"scripts": { "start": "supervisor ./bin/www" },
react中使用fetch:
①下载插件:npm i whatwg-fetch
②组件中引入和使用
import { fetch as fetchPolyfill } from 'whatwg-fetch' // 起一个别名,防止和原生的fetch冲突
fetch的第一个then方法中返回结果集,需要在这里对数据进行处理,设置希望返回的数据类型

componentDidMount() { fetchPolyfill('/users/login?username=admin&password=admin') .then((res) => res.json()) .then((data) => { console.log(data) // 这儿的data就是 express 中 res.json() 中的对象 }) }
post请求:需要下载qs依赖,post请求需要设置method和headers,body参数需要用qs模块转为查询字符串
fetchPolyfill('/users/login', {
method: 'post',
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
body: qs.stringify({ username: 'admin', password: 'admin' })
})
.then((res) => res.json())
.then((data) => {
console.log(data)
})
fetch封装:
1、src下新建utils/requset.js:
import { fetch as fetchPolyfill } from 'whatwg-fetch'
import qs from 'qs'
const get = (options) => {
let str = '',
path = ''
if (options.data) {
for (let key in options.data) {
str += `&${key}=${options.data[key]}`
}
}
path = options.url + '?' + str.slice(1)
return fetchPolyfill(path, {
headers: {
...options.headers,
'content-type': 'application-json'
},
credentials: 'include'
}).then((res) => res.json())
}
const post = (options) => {
return fetchPolyfill(options.url, {
method: 'post',
headers: {
...options.headers,
'content-type': 'application/x-www-form-urlencoded'
},
credentials: 'include',
body: qs.stringify(options.data)
}).then((res) => res.json())
}
export default {
get,
post
}
2、引入和使用
import request from './utils/request' async componentDidMount() { let res = await request.get({ url: '/users/login', data: { username: 'admin', password: 'admin' } }) console.log(res, 'get') request .post({ url: '/users/login', data: { username: 'admin', password: 'admin' } }) .then((data) => { console.log(data, 'post') }) }
fetch的特点:
1、返回promise
2、留给开发者足够的操作空间,可以自定义返回的数据类型:json、text、blob、arrayBuffer...
3、fetch处理成果后不是直接将结果返回,第一个then方法中返回一个未处理的结果集,在这里解析数据,第二个then方法中获取数据
4、默认不会携带cookie,需要设置 credentials: 'include'

浙公网安备 33010602011771号