Поиск по сайту:

Как настроить потребление REST API Vue.js с помощью Axios


Введение

В Vue 2.0 разработчики решили, что наличие встроенного клиентского модуля HTTP было довольно избыточным и могло бы лучше обслуживаться сторонними библиотеками. Наиболее часто рекомендуемой альтернативой является Axios.

Axios — это клиентская библиотека HTTP. Он использует promises по умолчанию и работает как на клиенте, так и на сервере, что делает его подходящим для получения данных во время рендеринга на стороне сервера. Поскольку он использует promises, вы можете комбинировать его с async/await, чтобы получить лаконичный и простой в использовании API.

В этой статье вы изучите добавление Axios в проект Vue.js для задач, связанных с заполнением данных и отправкой данных. Вы также узнаете о создании повторно используемого базового экземпляра.

Предпосылки

Чтобы следовать этой статье, вам понадобятся:

  • Node.js установлен локально, что можно сделать, следуя инструкциям по установке Node.js и созданию локальной среды разработки.

Установка и импорт axios

Для начала необходимо установить Axios.

Вы можете установить Axios с помощью npm:

  1. npm install axios --save

Или с пряжей:

  1. yarn add axios

При добавлении Axios в ваш проект Vue.js вы захотите его импортировать:

import axios from 'axios';

Далее мы будем использовать axios.get() для выполнения запроса GET.

Заполнение данных с помощью запроса GET

Вы можете использовать Axios непосредственно в своих компонентах для извлечения данных из метода или хука жизненного цикла:

<template>
  <div>
    <ul v-if="posts && posts.length">
      <li v-for="post of posts">
        <p><strong>{{post.title}}</strong></p>
        <p>{{post.body}}</p>
      </li>
    </ul>

    <ul v-if="errors && errors.length">
      <li v-for="error of errors">
        {{error.message}}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      posts: [],
      errors: []
    }
  },

  // Fetches posts when the component is created.
  created() {
    axios.get(`http://jsonplaceholder.typicode.com/posts`)
    .then(response => {
      // JSON responses are automatically parsed.
      this.posts = response.data
    })
    .catch(e => {
      this.errors.push(e)
    })
  }
}
</script>

Версия async/await будет выглядеть следующим образом:

<!-- ... template code ... -->

<script>
import axios from 'axios';

export default {
  data() {
    return {
      posts: [],
      errors: []
    }
  },

  // Fetches posts when the component is created.
  async created() {
    try {
      const response = await axios.get(`http://jsonplaceholder.typicode.com/posts`)
      this.posts = response.data
    } catch (e) {
      this.errors.push(e)
    }
  }
}
</script>

Этот код извлекает сообщения из JSONPlaceholder и заполняет неупорядоченный список сообщениями. Любые обнаруженные ошибки будут отображаться в отдельном неупорядоченном списке.

Далее мы будем использовать axios.post() для выполнения запроса POST.

Отправка данных с помощью POST-запроса

Вы можете использовать Axios для отправки запросов POST, PUT, PATCH и DELETE.

Примечание. Вы не захотите отправлять запросы при каждом входном событии. Рассмотрите возможность использования дросселирования или устранения дребезга.

<template>
  <div>
    <input type="text" v-model="postBody" @change="postPost()" />
    <ul v-if="errors && errors.length">
      <li v-for="error of errors">
        {{error.message}}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      postBody: '',
      errors: []
    }
  },

  methods: {
    // Pushes posts to the server when called.
    postPost() {
      axios.post(`http://jsonplaceholder.typicode.com/posts`, {
        body: this.postBody
      })
      .then(response => {})
      .catch(e => {
        this.errors.push(e)
      })
    }
  }
}
</script>

Версия async/await будет выглядеть следующим образом:

<!-- ... template code ... -->

<script>
import axios from 'axios';

export default {
  data() {
    return {
      postBody: '',
      errors: []
    }
  },

  methods: {
    // Pushes posts to the server when called.
    async postPost() {
      try {
        await axios.post(`http://jsonplaceholder.typicode.com/posts`, {
          body: this.postBody
        })
      } catch (e) {
        this.errors.push(e)
      }
    }
  }
}
</script>

Этот код создает поле ввода, которое будет отправлять содержимое в JSONPlaceholder. Любые обнаруженные ошибки будут отображаться в неупорядоченном списке.

Далее мы будем использовать axios.create() для создания базового экземпляра.

Создание общего базового экземпляра

Часто упускаемая из виду, но очень полезная возможность, предоставляемая Axios, — это возможность создать базовый экземпляр, который позволяет вам совместно использовать общий базовый URL-адрес и конфигурацию для всех вызовов экземпляра. Это удобно, если все ваши вызовы относятся к определенному серверу или вам необходимо совместно использовать заголовки, такие как заголовок Authorization:

import axios from 'axios';

export const HTTP = axios.create({
  baseURL: `http://jsonplaceholder.typicode.com/`,
  headers: {
    Authorization: 'Bearer {token}'
  }
})

Теперь вы можете использовать HTTP в своем компоненте:

<template>
  <div>
    <ul v-if="posts && posts.length">
      <li v-for="post of posts">
        <p><strong>{{post.title}}</strong></p>
        <p>{{post.body}}</p>
      </li>
    </ul>

    <ul v-if="errors && errors.length">
      <li v-for="error of errors">
        {{error.message}}
      </li>
    </ul>
  </div>
</template>

<script>
import { HTTP } from './http-common';

export default {
  data() {
    return {
      posts: [],
      errors: []
    }
  },

  created() {
    HTTP.get(`posts`)
    .then(response => {
      this.posts = response.data
    })
    .catch(e => {
      this.errors.push(e)
    })
  }
}
</script>

Этот код использует конфигурацию, установленную в http-common.js, и подключается к JSONPlaceholder с заголовком Authorization. Он извлекает сообщения и отлавливает любые ошибки.

Заключение

В этой статье вы познакомились с использованием Axios для заполнения и отправки данных. А также как создать многоразовый базовый экземпляр. Это лишь малая часть того, что может сделать Axios.

Посетите репозиторий GitHub для получения дополнительной информации и документации по Axios.

Если вы хотите узнать больше о Vue.js, посетите нашу тематическую страницу Vue.js, где вы найдете упражнения и проекты по программированию.