当前位置: 首页 > article >正文

前端网络请求

为什么需要做网络请求?

例如哔哩哔哩官网上展现的资源其实都是通过请求获取的:

是从霹雳霹雳服务器上请求信息,然后传输到客户端本地(浏览器)

页面资源越多,传输的的次数越多,每一次的传输就被称为一次请求

前端向后端请求有三种方式:ajax(原生),axios(第三方库),fetch(替代原生ajax的API)

网络请求的三种方式

ajax

控制台的NetWork的fetch/XHR是监控网络请求的部分

原生的ajax是通过new一个SXMLHttpRequest对象来进行生成的

//原生ajax
const xhr = new XMLHttpRequest()
//GET请求,发送请求的一种方式,第二个url为请求的地址,第三个参数为是否异步
xhr.open('GET', 'https://api.github.com/users/zhufengpeixun/repos', true)
xhr.send()

获取后发送请求,可以在NetWork下面看见一个新的请求

点击Header可以看见请求的url、方式、状态码

打开Response界面,服务器接收到我的请求以后会把我请求的相应资源发还给我,这个发回的过程我们称为响应

我们希望可以对响应回来的数据进行接收和处理,在这里我们可以通过几种方式操作

//原生ajax
const xhr = new XMLHttpRequest()
//GET请求,发送请求的一种方式,第二个url为请求的地址,第三个参数为是否异步
xhr.open('GET', 'https://api.github.com/users/zhufengpeixun/repos', true)
xhr.send()
//对响应进行操作,使用onreadystatechange事件来接收
xhr.onreadystatechange = function () {
    //在事件内部监听请求发送的状态,状态一旦改变就会触发事件
    //如果请求成功,readyState的状态码为4,或者通过XMLHttpRequest.Done来判断
    //确保响应完成,通过一个XMLHTTPRequest对象的status属性来获取,200表示响应成功
    if (xhr.readyState === 4 && xhr.status === 200) {
    //输出响应内容
    console.log(xhr.responseText)//类型为字符串
  }
}

获取到的数据是字符串

用JSON.parse()转回对象

如果在github上访问的话次数多了会报错:

GET除了进行请求操作,还可以在请求时发送一些数据,也就是在获取数据的时候向服务端发送一些额外的数据,这时候可以在请求的地址后面以【?】的方式拼接一些信息,这些信息被称为请求参数

另外,我这个github提供的接口是不支持根据URL+?的结构筛选出结果的

换个api:

//原生ajax
const xhr = new XMLHttpRequest()
//GET请求,发送请求的一种方式,第二个url为请求的地址,第三个参数为是否异步
xhr.open('GET', 'https://randomuser.me/api/?results=10&gender=female', true)
//属性=值&属性=值,获取性别为女的用户
xhr.send()
//对响应进行操作,使用onreadystatechange事件来接收
xhr.onreadystatechange = function () {
    //在事件内部监听请求发送的状态,状态一旦改变就会触发事件
    //如果请求成功,readyState的状态码为4,或者通过XMLHttpRequest.Done来判断
    //确保响应完成,通过一个XMLHTTPRequest对象的status属性来获取,200表示响应成功
    if (xhr.readyState === 4 && xhr.status === 200) {
    //输出响应内容
        //console.log(xhr.responseText)//类型为字符串
        //转为json对象
        console.log(JSON.parse(xhr.responseText))
  }
}

获取性别为女的

这样就完成了一次完整的请求加响应的过程

除了发送GET请求还可以发送POST请求,POST的含义是发送,发送给服务端让服务端完成一些操作,

进行POST请求的时候,除了可以发送普通文本,还可以发送多种格式的文件,例如图片、视频

单纯的GET请求只能发送纯文本,所以在使用POST请求的时候就需要告诉服务端你传输的是哪种格式的文本,所以我们需要在send()前添加xhr.setRequestHedaer(),这叫做设置请求头

//原生ajax
const xhr = new XMLHttpRequest()
//POST请求,发送请求的一种方式,第二个url为请求的地址,第三个参数为是否异步
xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true)
//设置请求头,Content-Type为请求的数据类型,application/x-www-form-urlencoded为表单数据(发送的数据类型为属性=值&属性=值的类型),'application/json'为json数据
xhr.setRequestHeader('Content-Type', 'application/json')
//通过send方法发送请求json数据,将数据转为字符串
const data = JSON.stringify({
  title: 'foo',
  body: 'bar',
  userId: 1
})
xhr.send(data)
//对响应进行操作,使用onreadystatechange事件来接收
xhr.onreadystatechange = function () {
    //在事件内部监听请求发送的状态,状态一旦改变就会触发事件
    //如果请求成功,readyState的状态码为4,或者通过XMLHttpRequest.Done来判断
    //确保响应完成,通过一个XMLHTTPRequest对象的status属性来获取,201表示POST响应成功
    if (xhr.readyState === 4 && xhr.status === 201) {
    //输出响应内容
        //console.log(xhr.responseText)//类型为字符串
        //转为json对象
        console.log(JSON.parse(xhr.responseText))
  }
}

可以看见发送正常

也可以正常在控制台看见数据:

可以看见ajax很麻烦,所以在开发中更多用的是第三方库

axios

axios库提供axios,是一个对象也是一个函数,也可以使用get发送get请求

//axios
//这一段话是在react中使用axios的方法,取代了上面jd原生的方法
//axios做了相应的逻辑封装,使得请求更加简单
(async () => {
    const res1 = await axios.get('https://randomuser.me/api/', {
        params: {
            results: 10,
            gender:'female'
        }
    })
    
    console.log(res1.data)
})()

就这样发送GET请求:

发送POST请求:

//axios
//这一段话是在react中使用axios的方法,取代了上面jd原生的方法
//axios做了相应的逻辑封装,使得请求更加简单
(async () => {
    const res1 = await axios.get('https://randomuser.me/api/', {
        params: {
            results: 10,
            gender:'female'
        }
    })
    //console.log(res1.data)
    const res2 = await axios.post('https://randomuser.me/api/', {
      //不用写params,直接写data
            results: 10,
            gender:'female'
    })
    console.log(res2.data)
})()

404了孩子们,因为这个API只支持GET请求,不支持POST请求

我们换个API,值得注意的是POST请求的响应成功码为201:

在发送不同请求的时候,url前面相同的部分被称为基地址(baseURL)

如果你希望在多个接口中把基地址提取出来,一种方法是自己拼,另一种方式可以用axios的配置来做处理;axios可以提供一个create来让我们进行一些自定义的对象功能设置

这样请求的时候可以少写一个baseURL,然后写一个请求拦截器,中间可以对请求做处理,判断是什么请求

也可以写一个响应拦截器,在每一个请求接收到响应之前做一个预处理,例如对格式做处理

也就是一个GET请求是先发送=》请求拦截器=》响应拦截器=》请求成功接收响应

Fetch API

Fetch发送GET请求

//Fetch API
//返回值是promise
fetch('https://randomuser.me/api/?results=10&gender=female').then(res => {
   if(res.ok){
       return res.json()
   }
}).then(data => {
    console.log(data)
})
//fetch请求方式

发送POST请求

//Fetch API
//发送GET请求,返回值是promise
fetch('https://randomuser.me/api/?results=10&gender=female').then(res => {
   if(res.ok){
       return res.json()
   }
}).then(data => {
    console.log(data)
})
//发送POST请求,返回值是promise
fetch('https://reqres.in/api/users', {
    method: 'POST',
    //设置请求头
    headers: {
        'Content-Type': 'application/json'
    },
    //设置请求体
    body: JSON.stringify({
        "name": "August",
        "job": "Frontend Developer" 
    })
}).then(res => {
   if(res.ok){
       return res.json()
   }
}).then(data => {
    console.log(data)
})

发送成功

axios需要设置请求头吗?

axios可以手动设置headers,不设置的话根据data的类型进行判断然后设置默认请求头


http://www.kler.cn/a/595307.html

相关文章:

  • 【强化学习】Reward Model(奖励模型)详细介绍
  • 智能工厂能耗分析:Python驱动的高效能源管理
  • 「0基础学爬虫」爬虫基础之抓包工具的使用
  • SQLite 查询数据库属性
  • AI视频是否会影响原创价值
  • 人工智能:企业RAG方案
  • 浅谈跨平台框架的演变(H5混合开发->RN->Flutter)
  • 【C++11】左值引用、右值引用、移动语义和完美转发
  • 编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化
  • 【华为Pura先锋盛典】华为Pura X“阔折叠”手机发布:首次全面搭载HarmonyOS 5
  • 城市更新浪潮下的破局之道:中建海龙模块化集成建筑技术的新应用
  • 2020年全国职业院校技能大赛改革试点赛高职组“云计算”竞赛赛卷第三场次题目:公有云部署与运维
  • centos 9 编译安装 rtpengine
  • 【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR
  • 如何提高G口服务器的安全性?
  • springboot整合modbus实现通讯
  • dfs刷题排列问题 + 子集问题 + 组和问题总结
  • 超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32) 进行问题排查
  • python中所有内置类型
  • 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】