【Ajax】- 原生方式 XMLHttpRequest

1.什么是 XMLHttpRequest

是浏览器内置的一个构造函数 作用:基于 new 出来的 XMLHttpRequest 实例对象,可以发起 Ajax 的请求。 axios 中的 axios.get()、axios.post()、axios() 方法,都是基于 XMLHttpRequest(简称:XHR)异步操作 封装出来的! 请大家思考:我们能否不用 axios 封装的 Ajax 函数,直接基于 XMLHttpRequest 发起 Ajax 请求? 答案:完全可以!

2.使用 XMLHttpRequest 发起 GET 请求

主要的 4 个实现步骤: 1、创建 xhr 对象 2、调用 xhr.open() 函数 相当于报文的请求行 3、调用 xhr.send() 函数 相当于报文的请求体 4、监听 load 事件 服务器返回给客户端的数据格式是json格式字符串 , 所以需要JSON.parse()

// 1、创建 xhr 对象
 let xhr = new XMLHttpRequest();
 // 2、调用 **xhr.open()** 函数
 xhr.open('GET', 'http://xxx.com/api/xx');
 // 3、调用 **xhr.send()** 函数       get方式没有请求体
 xhr.send();
 // 4、监听 load 事件  load事件,也可以放到 前面
 xhr.addEventListener('load', function () {
   console.log(JSON.parse(this.response));       // 服务器响应给客户端
 })

原生方式发起get无参请求和有参

 let btn = document.querySelector('button')
    btn.addEventListener('click', function() {
 // 1.创建异步对象
      let xhr = new XMLHttpRequest()
 ​
 // 2.使用异步对象发起请求:准备好请求报文
 // 2.1 请求行:请求方式和请求url,通过open方法可以设置请求行
      xhr.open('get', 'http://www.itcbc.com:3006/api/getbooks')
 // 如果需要带参数,则需要在url拼接:
 // xhr.open('get', 'http://www.itcbc.com:3006/api/getbooks?id=12163')
 ​
 // 2.2 请求头: 编码格式,get方式不需要设置请求头,因为get方式的参数只能在url拼接,它有默认的编码格式:UTF-8
 // 2.3 请求体:传递给服务器的参数,get方式的参数应该在url中拼接,所以get方式没有请求体,但是也需要调用send方法,可以不传递参数或者传递null
      xhr.send(null)
        
 // 3.使用异步对象接收响应
 // xhr.response:就是响应体
 // 当响应完成了,数据可以使用了,就会自动的触发一个load事件,在这个事件中就可以正确的获取到服务器的响应数据
      xhr.addEventListener('load', function() {
   // 如果不出意外,服务器返回给客户端的数据格式是json格式字符串
      console.log(JSON.parse(xhr.response), typeof JSON.parse(xhr.response))
    })
 })

发起 Ajax 请求的核心对象是 XMLHttpRequest

通过 load 事件 、xhr.response(响应体) 拿到服务器响应回来的数据

URL参数,只能拼接在 URL 地址 后面

请求体,放到 send() 里面 如: send(请求体)

细节:

1、get方式没有请求体,但是也需要调用send方法,可以不传递参数或者传递null

2、当响应完成了,数据可以使用了,就会自动的触发一个load事件,在这个事件中就可以正确的获取到服务器的响应数据

3、如果不出意外,服务器返回给客户端的数据格式是json格式字符串

提交请求体数据,需指定Content-Type头

当需要提交请求体数据时,需要在 xhr.open() 之后,调用 xhr.setRequestHeader() 函数,指定请求体的编码格式

 let xhr = new XMLHttpRequest();
 xhr.addEventListener('load', function () {
   console.log(this.response);
 })
 // 将请求参数拼接到url后面
 xhr.open('POST', 'http://www.itcbc.com/api/post');
 ​
 // 根据请求体格式的不同,需设置对应的Content-Type头
 xhr.setRequestHeader('Content-Type', '值')
 ​
 xhr.send('username=zs&age=20');

原生方式发起post方式请求

细节:

1、参数不可在url传递,只能在send()请求体设置

2、一定要设置请求头setRequestHeader(),并且设置的请求头格式要对应你传递什么格式的参数

3、传递参数格式是 key=value&key=value,如果是对象则需要转换json格式,请求头格式也需要相同更换

 let btnadd = document.querySelector('.btnadd')
 let bookname = document.querySelector('[name="bookname"]')
 let author = document.querySelector('[name="author"]')
 let publisher = document.querySelector('[name="publisher"]')
 ​
 btnadd.addEventListener('click', function() {
 // 收集数据
 let booknameV = bookname.value
 let authorV = author.value
 let publisherV = publisher.value
 ​
 // 创建异步对象
  let xhr = new XMLHttpRequest()
 ​
 // 发起请求
 // 请求行:post不能在请求行中拼接参数,否则相当于没有传递
  xhr.open('post', 'http://www.itcbc.com:3006/api/addbook')
     
 // 请求头:post方式传递普通键值对,需要设置Content-type编码格式,否则后台无法正确的获取到参数
 // xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
 // json格式,上面的是字符串格式
  xhr.setRequestHeader('Content-Type', 'application/json')
     
 // 请求体,参数格式与get一样,除非你进行其它的处理
 // xhr.send(`bookname=${booknameV}&author=${authorV}&publisher=${publisherV}`)
 // 需要对象方式提交,则需要转换JSON,否则会报错,请求头也需要更换json
    xhr.send(
        JSON.stringify({
          bookname: booknameV,
          author: authorV,
          publisher: publisherV
        })
    )
 ​
 // 接收响应
 xhr.addEventListener('load', function() {
      console.log(JSON.parse(xhr.response))
    })
 })

为了方便服务器接收数据,当提交请求体时,需要指定一个叫做 Content-Type 的请求头

请求体格式 Content-Type 是否需要在代码中指定
参数=值&参数=值 application/x-www-form-urlencoded
'{ "id": 1, "name": "zs" }' application/json
new FormData() multipart/form-data; xxxxxxxxx随机字符 否,浏览器自动设置

使用axios就不用关心这个请求头了,因为axios已经帮我们处理好了加请求头这件事,不过写原生代码,就需要自己指定了

猜你喜欢

转载自blog.csdn.net/m0_55960697/article/details/124308870