Easy Tutorial
❮ Vue3 Create Project Vue3 Template Syntax ❯

Vue3 Ajax(axios)

It is recommended to use axios for ajax requests in Vue3.

Axios is a Promise-based HTTP client that can be used in both the browser and node.js.

Github open source address: https://github.com/axios/axios

Installation Methods

Using CDN:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

or

<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>

Using npm:

$ npm install axios

Using bower:

$ bower install axios

Using yarn:

$ yarn add axios

Usage:

Vue.axios.get(api).then((response) => {
  console.log(response.data)
})

this.axios.get(api).then((response) => {
  console.log(response.data)
})

this.$http.get(api).then((response) => {
  console.log(response.data)
})

Browser Support


GET Method

We can easily fetch JSON data:

GET Example

const app = {
  data() {
    return {
      info: 'Ajax Test!!'
    }
  },
  mounted () {
    axios
      .get('https://www.tutorialpro.org/try/ajax/json_demo.json')
      .then(response => (this.info = response))
      .catch(function (error) { // Request error handling
        console.log(error);
    });
  }
}

Vue.createApp(app).mount('#app')

Using response.data to read JSON data:

GET Example

<div id="app">
  <h1>Website List</h1>
  <div
    v-for="site in info"
  >
    {{ site.name }}
  </div>
</div>
<script type="text/javascript">
const app = {
  data() {
    return {
      info: 'Ajax Test!!'
    }
  },
  mounted () {
    axios
      .get('https://www.tutorialpro.org/try/ajax/json_demo.json')
      .then(response => (this.info = response))
      .catch(function (error) { // Request error handling
        console.log(error);
    });
  }
}

Vue.createApp(app).mount('#app')
</script>

GET method parameter passing format is as follows:

Parameter Passing Explanation

// Directly add parameters to the URL ID=12345
axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// Alternatively, parameters can be set via params:
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

POST Method

POST Example

const app = {
  data() {
    return {
      info: null
    }
  },
  mounted () {
    axios
      .post('https://www.tutorialpro.org/try/ajax/demo_axios_post.php')
      .then(response => (this.info = response))
      .catch(function (error) { // Request error handling
        console.log(error);
      });
  }
}

Vue.createApp(app).mount('#app')

POST method parameter passing format is as follows:

Parameter Passing Explanation

axios.post('/user', {
    firstName: 'Fred',        // Parameter firstName
    lastName: 'Flintstone'    // Parameter lastName
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

Executing Multiple Concurrent Requests

Example

function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));

axios API

Requests can be made by passing the relevant config to axios.

Example

axios(config)
// Send a POST request
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
// GET request for remote image
axios({
  method:'get',
  url:'http://bit.ly/2mTM3nY',
  responseType:'stream'
})
  .then(function(response) {
  response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
axios(url[, config])
// Send a GET request (default method)
axios('/user/12345');

Request Method Aliases

For convenience aliases have been provided for all supported request methods:

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])

Note: When using alias methods, url, method, and data properties don't need to be specified in config.

Concurrency

Helper functions for dealing with concurrent requests:

axios.all(iterable)
axios.spread(callback)

Creating an Instance

You can create a new instance of axios with a custom config:

axios.create([config])
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

Instance Methods

The available instance methods are listed below. The specified config will be merged with the instance config:

axios#request(config)
axios#get(url[, config])
axios#delete(url[, config])
axios#head(url[, config])
axios#post(url[, data[, config]])
axios#put(url[, data[, config]])
axios#patch(url[, data[, config]])

Request Config

These are the available config options for making requests. Only the url is required. If method is not specified, the request will default to GET.

{
  // `url` is the server URL that will be used for the request
  url: "/user",

  // `method` is the request method to be used when making the request
  method: "get", // default

  // `baseURL` will be prepended to `url` unless `url` is absolute.
  // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs
  baseURL: "https://some-domain.com/api/",

  // `transformRequest` allows changes to the request data before it is sent to the server
  // This is only applicable for request methods 'PUT', 'POST', and 'PATCH'
  // The last function in the array must return a string or an instance of Buffer, ArrayBuffer, FormData, or Stream
  transformRequest: [function (data) {
    // Do whatever you want to transform the data

    return data;
  }],

  // `transformResponse` allows changes to the response data to be made before it is passed to then/catch
  transformResponse: [function (data) {
    // Do whatever you want to transform the data

    return data;
  }],

  // `headers` are custom headers to be sent
  headers: {"X-Requested-With": "XMLHttpRequest"},

  // `params` are the URL parameters to be sent with the request
  // Must be a plain object or a URLSearchParams object
  params: {
    ID: 12345
  },

  // `paramsSerializer` is an optional function in charge of serializing `params`
  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)

paramsSerializer: function(params) {
    return Qs.stringify(params, {arrayFormat: "brackets"})
  },

  // `data` is the data to be sent as the request body
  // Only applicable for request methods "PUT", "POST", and "PATCH"
  // When no `transformRequest` is set, it must be one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser specific: FormData, File, Blob
  // - Node specific: Stream
  data: {
    firstName: "Fred"
  },

  // `timeout` specifies the number of milliseconds before the request times out (0 means no timeout)
  // If the request takes longer than `timeout`, the request will be aborted
  timeout: 1000,

  // `withCredentials` indicates whether or not cross-site Access-Control requests should be made using credentials
  withCredentials: false, // default

  // `adapter` allows custom handling of requests to make testing easier
  // Returns a promise and applies a valid response (see [response docs](#response-api)).
  adapter: function (config) {
    /* ... */
  },

  // `auth` indicates that HTTP Basic auth should be used, and supplies credentials
  // This will set an `Authorization` header, overwriting any existing `Authorization` custom headers you have set using `headers`
  auth: {
    username: "janedoe",
    password: "s00pers3cret"
  },

  // `responseType` indicates the type of data that the server will respond with
  // Options are "arraybuffer", "blob", "document", "json", "text", "stream"
  responseType: "json", // default

  // `xsrfCookieName` is the name of the cookie to use as a value for xsrf token
  xsrfCookieName: "XSRF-TOKEN", // default

  // `xsrfHeaderName` is the name of the http header that carries the xsrf token value
  xsrfHeaderName: "X-XSRF-TOKEN", // default

  // `onUploadProgress` allows handling of progress events for uploads
  onUploadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },

  // `onDownloadProgress` allows handling of progress events for downloads
  onDownloadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },

  // `maxContentLength` defines the max size of the http response content in bytes allowed
  maxContentLength: 2000,

  // `validateStatus` defines whether to resolve or reject the promise for a given HTTP response status code. If `validateStatus` returns `true` (or is set to `null` or `undefined`), the promise will be resolved; otherwise, the promise will be rejected.
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },

  // `maxRedirects` defines the maximum number of redirects to follow in node.js
  // If set to 0, no redirects will be followed
  maxRedirects: 5, // default

  // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http and https requests, respectively, in node.js. This allows options to be configured like this:
  // `keepAlive` is not enabled by default
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // "proxy" defines the hostname and port of the proxy server
  // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and supplies credentials
  // This will set a `Proxy-Authorization` header, overwriting any existing `Proxy-Authorization` custom headers you have set using `headers`.
  proxy: {
    host: "127.0.0.1",
    port: 9000,
    auth: {
      username: "mikeymike",
      password: "rapunz3l"
    }
  },

  // `cancelToken` specifies a cancel token that can be used to cancel the request
  // (see the Cancellation section for more information)
  cancelToken: new CancelToken(function (cancel) {
  })
}

Response Structure

The response for an axios request contains the following information:

{
  // `data` is the response that was provided by the server
  data: {},

  // `status` is the HTTP status code from the server response
  status: 200,

  // `statusText` is the HTTP status message from the server response
  statusText: "OK",

  // `headers` the headers that the server responded with
  headers: {},

  // `config` is the config that was provided to `axios` for the request
  config: {}
}

When using then, you will receive the response as follows:

axios.get("/user/12345")
  .then(function(response) {
    console.log(response.data);
    console.log(response.status);
    console.log(response.statusText);
    console.log(response.headers);
    console.log(response.config);
  });

When using catch, or passing a rejection callback as the second parameter of then, the response will be available through the error object.

Config Defaults

You can specify config defaults that will be applied to every request.

Global axios defaults:

axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

Custom instance defaults:

// Set config defaults when creating the instance
var instance = axios.create({
  baseURL: 'https://api.example.com'
});

// Alter defaults after instance has been created
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

Config Order of Precedence

Config is merged according to a specific order of precedence. This order is: the defaults found in lib/defaults.js are first, then instance.defaults property, and finally config argument for the request. The latter will take precedence over the former. Here is an example:

// Create an instance using the config defaults provided by the library
// At this point the timeout config value is `0` as is the default for the library
var instance = axios.create();

// Override timeout default for the library
// Now all requests using this instance will wait 2.5 seconds before timing out
instance.defaults.timeout = 2500;

// Override timeout for this request as it's known to take a long time
instance.get('/longRequest', {
  timeout: 5000
});

Interceptors

You can intercept requests or responses before they are handled by then or catch.

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  });

If you need to remove an interceptor later, you can:

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

You can also add interceptors to a custom axios instance:

var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

Error Handling:

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

You can define a custom HTTP status code error range using the validateStatus config option.

axios.get('/user/12345', {
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  }
});
return status < 500; // The request will only be rejected if the status code is greater than or equal to 500
}
})

Cancellation

Cancel requests using cancel tokens.

Axios' cancel token API is based on the cancelable promises proposal.

You can create a cancel token using the CancelToken.source factory method as shown below:

var CancelToken = axios.CancelToken;
var source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // Handle error
  }
});

// Cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');

You can also create a cancel token by passing an executor function to the CancelToken constructor:

var CancelToken = axios.CancelToken;
var cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // The executor function receives a cancel function as a parameter
    cancel = c;
  })
});

// Cancel the request
cancel();

Note: You can use the same cancel token to cancel multiple requests.

Using application/x-www-form-urlencoded format

By default, axios serializes JavaScript objects to JSON. To send data in the application/x-www-form-urlencoded format, you can use the following options.

Browser

In a browser environment, you can use the URLSearchParams API:

const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);

Not all browsers support URLSearchParams.

Alternatively, you can use the qs library to encode the data:

const qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));

// Or in another way (ES6),

import qs from 'qs';
const data = { 'bar': 123 };
const options = {
  method: 'POST',
  headers: { 'content-type': 'application/x-www-form-urlencoded' },
  data: qs.stringify(data),
  url,
};
axios(options);

Node.js Environment

In node.js, you can use the querystring module:

const querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));

Similarly, you can use the qs library as in the browser.

Promises

Axios relies on the native ES6 Promise implementation that is supported.

If your environment doesn't support ES6 Promises, you can use a polyfill.

TypeScript Support

Axios includes TypeScript definitions.

import axios from "axios";
axios.get("/user?ID=12345");
❮ Vue3 Create Project Vue3 Template Syntax ❯