React中的ajax请求和跨域问题

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React中的ajax请求和跨域问题相关的知识,希望对你有一定的参考价值。

目录

1.ajax请求

React本身并不包含发送ajax请求的代码,需要自己引入一个第三方库
不推荐使用jQuery,因为它比较重,而且使用js操作DOM,在React中我们不推荐这样
这里推荐轻量级框架axios

npm i axios

2. 简单模拟ajax请求

①客户端 --- React

创建项目:create-react-app client

客户端页面所在地址为本机地址,端口为3000

/client/public/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <title>Hello</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

 /client/src/index.js

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'  //引入App组件

//渲染App到页面
ReactDOM.render(<App/>,document.getElementById('root'));

  /client/src/App.js

import React,Component from 'react'
import axios from 'axios'

export default class App extends Component
  getStudentData = ()=>
    axios.get('http://localhost:3000/api1/students').then(
      response => console.log('成功',response.data),
      error => console.log('失败',error);
    )
  
  getCarData = ()=>
    axios.get('http://localhost:3000/api2/cars').then(
      response => console.log('成功',response.data),
      error => console.log('失败',error);
    )
  
  render()
    return (
      <div>
        <button onClick=this.getStudentData>获取学生数据</button>
        <button onClick=this.getCarData>获取汽车数据</button>
      </div>
    )
  

运行:npm start 

②服务器端 --- Node + Express

在本机模拟了两台服务器,分别监听端口5000和5001,开启服务:

 node server1.js
 node server2.js

/server/server1.js

const express = require('express')
const app = express()

app.use((req,res,next)=>
  console.log('有人请求服务器1了')
  next()
)

app.use('/students',(req,res)=>
  const students = [
    id:'001',name:'Tom',age:18,
    id:'002',name:'Nancy',age:19,
    id:'003',name:'John',age:20,
  ]
  res.send(students)
)

app.listen(5000,err=>
  if(!err) console.log('服务器1启动成功,监听端口为5000...')
)

/server/server2.js

const express = require('express')
const app = express()

app.use((req,res,next)=>
  console.log('有人请求服务器2了')
  next()
)

app.use('/cars',(req,res)=>
  const cars = [
    id:'001',name:'奔驰',price:199,
    id:'002',name:'马自达',age:109,
    id:'003',name:'捷达',age:120,
  ]
  res.send(cars)
)

app.listen(5001,err=>
  if(!err) console.log('服务器2启动成功,监听端口为5001...')
)

3.解决跨域问题

①方法一

/client/src/package.json中追加如下配置

"proxy":"http://localhost:5000"

缺点:不能配置多个代理
工作方式:按上述方式配置代理,当请求了3000端口不存在的资源时,才会将该请求转发给5000(优先匹配前端资源) 

②方法二

创建代理配置文件:/client/src/setupProxy.js

PS: 我的React版本为17.0.2,不同版本的React配置可能不一样

const createProxyMiddleware = require('http-proxy-middleware') //这个库在初始化脚手架时就安装了,所以不用额外安装

module.exports = function(app) 
  app.use(
    createProxyMiddleware('/api1', 
      target: 'http://localhost:5000',     //配置转发目标地址
      //控制服务器接收到的请求头中host字段的值,默认为false。
      //为true,这里的host为:localhost:5000;为false,这里的host为:localhost:3000
      changeOrigin: true,
      pathRewrite: '^/api1':''           //修改url,去除请求前缀'/api1'
    ),
    createProxyMiddleware('/api2', 
      target: 'http://localhost:5001',
      changeOrigin: true,
      pathRewrite: '^/api2':''
    )
  )

优点:可以配置多个代理,可以灵活地控制请求是否走代理 

4.效果演示

以上是关于React中的ajax请求和跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

Vue--axios:vue中的ajax异步请求(发送和请求数据)vue-resource异步请求和跨域

前端干活系列----ajax请求和跨域请求

AJAX请求和跨域请求详解(原生JSJquery)

Ajax和跨域

一篇搞定vue请求和跨域

从零开始学 Web 之 Vue.jsVue的Ajax请求和跨域