前端请求数据的几种方法

本文最后更新于:2022年3月30日 下午

前端调用后端接口获取数据的几种常用方法

原生Ajax

这是最为古老的一种,自ajax方案提出之后就存在的

  • get请求:

    // 创建一个xhr对象
    var xhr = new XMLHttpRequest()
    
    // 建立连接
    xhr.open('get', 'http://39.98.122.169:8888/tags/hot/4')
    
    // 提交发送
    xhr.send()
    
    // 接收返回数据
    xhr.onload = function () {
      console.log(JSON.parse(xhr.response))
    }

    通常还有一步监听请求状态和状态码的,如果这样的话是:

    // get请求
    var xhr = new XMLHttpRequest();
    
    xhr.open('GET', '/api/user?id=333', true);
    xhr.send();
    
    xhr.onreadystatechange = function (e) {
      if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(JSON.parse(xhr.response))
      }
    }
  • post

    let obj = {
      page: 1,
      pageSize: 10,
      year: 2021,
      month: 2
    }
    var xhr = new XMLHttpRequest()
    
    xhr.open('post', 'http://39.98.122.169:8888/articles')
    
    xhr.setRequestHeader('Content-Type', 'application/json')
    
    xhr.send(JSON.stringify(obj))
    
    xhr.onload = () => {
      console.log(JSON.parse(xhr.response))
    }
    
    // 或者这样
    // xhr.onreadystatechange = function (e) {
    //   if (xhr.readyState == 4 && xhr.status == 200) {
    //     console.log(JSON.parse(xhr.response))
    //   }
    // }

基于原生的JQuery Ajax封装

大多数人最开始学习ajax的时候都是直接上手jQuery的ajax。但是,这也仅仅是对原生ajax的封装

  • get

    $.ajax({
      url: 'http://39.98.122.169:8888/tags/hot/4',
      type: 'GET',
      success: res => {
          console.log(res);
      },
      error: (xhr, statusCode, err) => {
          console.log(err);
      }
    });
  • post

    let jsonData = {
      page: 1,
      pageSize: 10,
      year: 2021,
      month: 2
    };
    $.ajax({
      url: 'http://39.98.122.169:8888/articles',
      type: 'POST',
      dataType: 'json',
      contentType: 'application/json;charset=utf-8',
      data: JSON.stringify(jsonData),
      success: res => {
          console.log(res);
      },
      error: (xhr, statusCode, err) => {
          console.log(err);
      }
    });

原生fetch

fetch其实是原生ajax的一种promise封装,用.then()这种友好的方式得到下一个promise从而返回数据,最重要的是这居然是原生js的api!

  • get

    fetch(`http://39.98.122.169:8888/tags/hot/4`, {
      method: 'GET'
    })
      .then( response => response.json() )
      .then( result => result.data )
      .then( data => console.log(data) )
  • post

    let obj = {
      page: 1,
      pageSize: 10,
      year: 2021,
      month: 2
    }
    fetch(`http://39.98.122.169:8888/articles`, {
      method: 'POST',
      body: JSON.stringify(obj),
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then( response => response.json() )
      .then( result => result.data )
      .then( data => console.log(data) )

这确实好多了

axios

使用vue时的请求数据好伙伴,但是有多少人知道其实它也只是原生ajax的promise封装呢?

  • get

    const { data: res } = await this.$http.post(`articles/hot/2`)
    console.log(res)
  • post

    let body = {
      page: 1,
      pageSize: 10,
      year: 2021,
      month: 2
    }
    const { data: res } = await this.$http.post(`articles`, body)
    console.log(res)
    
    // 要是想加上请求头的话
    // var config = {
    //   headers: {
    //     'Content-Type': 'application/json;charset=utf-8'
    //   }
    // }
    // const { data: res } = await this.$http.post(`articles`, body, config)

简洁性一目了然


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!