README.md 20.2 KB
Newer Older
M
mzabriskie 已提交
1
# axios
M
mzabriskie 已提交
2 3

[![npm version](https://img.shields.io/npm/v/axios.svg?style=flat-square)](https://www.npmjs.org/package/axios)
N
Nick Uraltsev 已提交
4
[![build status](https://img.shields.io/travis/axios/axios.svg?style=flat-square)](https://travis-ci.org/axios/axios)
M
mzabriskie 已提交
5
[![code coverage](https://img.shields.io/coveralls/mzabriskie/axios.svg?style=flat-square)](https://coveralls.io/r/mzabriskie/axios)
M
Matt Zabriskie 已提交
6
[![npm downloads](https://img.shields.io/npm/dm/axios.svg?style=flat-square)](http://npm-stat.com/charts.html?package=axios)
M
Matt Zabriskie 已提交
7
[![gitter chat](https://img.shields.io/gitter/room/mzabriskie/axios.svg?style=flat-square)](https://gitter.im/mzabriskie/axios)
B
Ben Creasy 已提交
8
[![code helpers](https://www.codetriage.com/axios/axios/badges/users.svg)](https://www.codetriage.com/axios/axios)
M
Matt Zabriskie 已提交
9

M
mzabriskie 已提交
10
Promise based HTTP client for the browser and node.js
M
Matt Zabriskie 已提交
11 12 13

## Features

M
mzabriskie 已提交
14 15
- Make [XMLHttpRequests](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) from the browser
- Make [http](http://nodejs.org/api/http.html) requests from node.js
M
mzabriskie 已提交
16
- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API
M
mzabriskie 已提交
17
- Intercept request and response
M
mzabriskie 已提交
18
- Transform request and response data
N
Nick Uraltsev 已提交
19
- Cancel requests
M
Matt Zabriskie 已提交
20
- Automatic transforms for JSON data
M
mzabriskie 已提交
21
- Client side support for protecting against [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
M
Matt Zabriskie 已提交
22

M
mzabriskie 已提交
23
## Browser Support
M
mzabriskie 已提交
24

N
Nick Uraltsev 已提交
25
![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) |
26
--- | --- | --- | --- | --- | --- |
27
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 11 ✔ |
M
mzabriskie 已提交
28

M
Matt Zabriskie 已提交
29
[![Browser Matrix](https://saucelabs.com/open_sauce/build_matrix/axios.svg)](https://saucelabs.com/u/axios)
30

M
Matt Zabriskie 已提交
31 32 33 34 35 36 37 38
## Installing

Using npm:

```bash
$ npm install axios
```

M
Matt Zabriskie 已提交
39 40 41 42 43 44
Using bower:

```bash
$ bower install axios
```

M
Matt Zabriskie 已提交
45 46 47 48 49 50
Using cdn:

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

M
Matt Zabriskie 已提交
51 52 53 54 55
## Example

Performing a `GET` request

```js
J
Jim Lynch 已提交
56 57
const axios = require('axios');

M
Matt Zabriskie 已提交
58 59
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
M
mzabriskie 已提交
60
  .then(function (response) {
61
    // handle success
M
mzabriskie 已提交
62 63
    console.log(response);
  })
N
Nick Uraltsev 已提交
64
  .catch(function (error) {
65
    // handle error
N
Nick Uraltsev 已提交
66
    console.log(error);
67 68 69
  })
  .then(function () {
    // always executed
M
mzabriskie 已提交
70
  });
71

M
Matt Zabriskie 已提交
72 73
// Optionally the request above could also be done as
axios.get('/user', {
M
mzabriskie 已提交
74 75 76 77 78 79 80
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
81 82
  .catch(function (error) {
    console.log(error);
83 84 85 86
  })
  .then(function () {
    // always executed
  });  
87

D
Deric Cain 已提交
88 89
// Want to use async/await? Add the `async` keyword to your outer function/method.
async function getUser() {
D
Deric Cain 已提交
90
  try {
D
Deric Cain 已提交
91
    const response = await axios.get('/user?ID=12345');
D
Deric Cain 已提交
92 93
    console.log(response);
  } catch (error) {
D
Deric Cain 已提交
94
    console.error(error);
D
Deric Cain 已提交
95
  }
D
Deric Cain 已提交
96
}
M
Matt Zabriskie 已提交
97 98
```

99
> **NOTE:** `async/await` is part of ECMAScript 2017 and is not supported in Internet
D
Deric Cain 已提交
100 101
> Explorer and older browsers, so use with caution.

M
Matt Zabriskie 已提交
102 103 104 105
Performing a `POST` request

```js
axios.post('/user', {
M
mzabriskie 已提交
106 107 108 109 110 111
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
112 113
  .catch(function (error) {
    console.log(error);
M
mzabriskie 已提交
114
  });
M
Matt Zabriskie 已提交
115 116
```

M
Matt Zabriskie 已提交
117 118
Performing multiple concurrent requests

M
Matt Zabriskie 已提交
119
```js
M
Matt Zabriskie 已提交
120
function getUserAccount() {
M
mzabriskie 已提交
121
  return axios.get('/user/12345');
M
Matt Zabriskie 已提交
122 123 124
}

function getUserPermissions() {
M
mzabriskie 已提交
125
  return axios.get('/user/12345/permissions');
M
Matt Zabriskie 已提交
126 127 128
}

axios.all([getUserAccount(), getUserPermissions()])
M
mzabriskie 已提交
129 130 131
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));
M
Matt Zabriskie 已提交
132 133
```

M
mzabriskie 已提交
134
## axios API
M
Matt Zabriskie 已提交
135

M
Matt Zabriskie 已提交
136
Requests can be made by passing the relevant config to `axios`.
M
Matt Zabriskie 已提交
137

M
Matt Zabriskie 已提交
138
##### axios(config)
M
Matt Zabriskie 已提交
139 140

```js
M
Matt Zabriskie 已提交
141
// Send a POST request
M
Matt Zabriskie 已提交
142
axios({
M
Matt Zabriskie 已提交
143 144 145 146 147 148
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
M
Matt Zabriskie 已提交
149 150 151
});
```

152 153 154 155 156 157 158 159 160 161 162 163
```js
// 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'))
});
```

M
Matt Zabriskie 已提交
164 165 166
##### axios(url[, config])

```js
J
Jamison Dance 已提交
167
// Send a GET request (default method)
M
Matt Zabriskie 已提交
168 169 170
axios('/user/12345');
```

M
Matt Zabriskie 已提交
171 172 173 174
### Request method aliases

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

175
##### axios.request(config)
M
Matt Zabriskie 已提交
176 177 178
##### axios.get(url[, config])
##### axios.delete(url[, config])
##### axios.head(url[, config])
179
##### axios.options(url[, config])
M
Matt Zabriskie 已提交
180 181 182
##### axios.post(url[, data[, config]])
##### axios.put(url[, data[, config]])
##### axios.patch(url[, data[, config]])
M
Matt Zabriskie 已提交
183 184

###### NOTE
M
Matt Zabriskie 已提交
185
When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config.
M
Matt Zabriskie 已提交
186

M
Matt Zabriskie 已提交
187 188
### Concurrency

M
Matt Zabriskie 已提交
189 190
Helper functions for dealing with concurrent requests.

M
Matt Zabriskie 已提交
191 192 193
##### axios.all(iterable)
##### axios.spread(callback)

N
Nick Uraltsev 已提交
194 195 196 197 198 199 200
### Creating an instance

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

##### axios.create([config])

```js
201
const instance = axios.create({
202
  baseURL: 'https://some-domain.com/api/',
N
Nick Uraltsev 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215
  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])
216
##### axios#options(url[, config])
N
Nick Uraltsev 已提交
217 218 219 220
##### axios#post(url[, data[, config]])
##### axios#put(url[, data[, config]])
##### axios#patch(url[, data[, config]])

M
Matt Zabriskie 已提交
221
## Request Config
M
Matt Zabriskie 已提交
222

N
Nick Uraltsev 已提交
223
These are the available config options for making requests. Only the `url` is required. Requests will default to `GET` if `method` is not specified.
M
Matt Zabriskie 已提交
224

M
Matt Zabriskie 已提交
225 226
```js
{
M
mzabriskie 已提交
227 228
  // `url` is the server URL that will be used for the request
  url: '/user',
229

230 231 232
  // `method` is the request method to be used when making the request
  method: 'get', // default

233 234
  // `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
235 236
  // to methods of that instance.
  baseURL: 'https://some-domain.com/api/',
M
mzabriskie 已提交
237 238 239

  // `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'
240 241
  // The last function in the array must return a string or an instance of Buffer, ArrayBuffer,
  // FormData or Stream
242 243
  // You may modify the headers object.
  transformRequest: [function (data, headers) {
M
mzabriskie 已提交
244
    // Do whatever you want to transform the data
245

M
mzabriskie 已提交
246 247 248 249 250 251 252
    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
253

M
mzabriskie 已提交
254 255 256 257 258 259
    return data;
  }],

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

R
rupertrutland 已提交
260
  // `params` are the URL parameters to be sent with the request
261
  // Must be a plain object or a URLSearchParams object
M
mzabriskie 已提交
262 263 264
  params: {
    ID: 12345
  },
265 266 267 268 269 270

  // `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'})
  },
M
mzabriskie 已提交
271 272 273

  // `data` is the data to be sent as the request body
  // Only applicable for request methods 'PUT', 'POST', and 'PATCH'
274 275 276
  // When no `transformRequest` is set, must be of one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser only: FormData, File, Blob
277
  // - Node only: Stream, Buffer
M
mzabriskie 已提交
278 279 280 281
  data: {
    firstName: 'Fred'
  },

M
mzabriskie 已提交
282 283 284 285
  // `timeout` specifies the number of milliseconds before the request times out.
  // If the request takes longer than `timeout`, the request will be aborted.
  timeout: 1000,

M
mzabriskie 已提交
286 287 288 289
  // `withCredentials` indicates whether or not cross-site Access-Control requests
  // should be made using credentials
  withCredentials: false, // default

290
  // `adapter` allows custom handling of requests which makes testing easier.
N
Nick Uraltsev 已提交
291
  // Return a promise and supply a valid response (see lib/adapters/README.md).
292
  adapter: function (config) {
293 294 295
    /* ... */
  },

296
  // `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
297 298
  // This will set an `Authorization` header, overwriting any existing
  // `Authorization` custom headers you have set using `headers`.
299
  auth: {
I
Idan Gazit 已提交
300 301
    username: 'janedoe',
    password: 's00pers3cret'
A
Andy Kogut 已提交
302
  },
303

M
mzabriskie 已提交
304
  // `responseType` indicates the type of data that the server will respond with
N
Nick Uraltsev 已提交
305
  // options are 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
M
mzabriskie 已提交
306 307
  responseType: 'json', // default

308 309 310 311
  // `responseEncoding` indicates encoding to use for decoding responses
  // Note: Ignored for `responseType` of 'stream' or client-side requests
  responseEncoding: 'utf8', // default

M
mzabriskie 已提交
312 313 314 315
  // `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
316 317
  xsrfHeaderName: 'X-XSRF-TOKEN', // default

318 319 320 321 322 323 324
  // `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) {
325
    // Do whatever you want with the native progress event
326
  },
327

328
  // `maxContentLength` defines the max size of the http response content in bytes allowed
329 330 331 332 333 334 335 336
  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
N
Nick Uraltsev 已提交
337 338 339 340
  },

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

S
Starfox64 已提交
343 344
  // `socketPath` defines a UNIX Socket to be used in node.js.
  // e.g. '/var/run/docker.sock' to send requests to the docker daemon.
E
Emily Morehouse 已提交
345 346
  // Only either `socketPath` or `proxy` can be specified.
  // If both are specified, `socketPath` is used.
S
Starfox64 已提交
347 348
  socketPath: null, // default

349
  // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
350
  // and https requests, respectively, in node.js. This allows options to be added like
351 352
  // `keepAlive` that are not enabled by default.
  httpAgent: new http.Agent({ keepAlive: true }),
353 354 355
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' defines the hostname and port of the proxy server
356
  // Use `false` to disable proxies, ignoring environment variables.
357 358 359 360
  // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and
  // supplies credentials.
  // This will set an `Proxy-Authorization` header, overwriting any existing
  // `Proxy-Authorization` custom headers you have set using `headers`.
361 362
  proxy: {
    host: '127.0.0.1',
M
Marc Mignonsin 已提交
363
    port: 9000,
364
    auth: {
M
Marc Mignonsin 已提交
365 366 367
      username: 'mikeymike',
      password: 'rapunz3l'
    }
N
Nick Uraltsev 已提交
368 369 370 371 372 373
  },

  // `cancelToken` specifies a cancel token that can be used to cancel the request
  // (see Cancellation section below for details)
  cancelToken: new CancelToken(function (cancel) {
  })
M
Matt Zabriskie 已提交
374 375 376
}
```

M
Matt Zabriskie 已提交
377
## Response Schema
M
Matt Zabriskie 已提交
378

M
mzabriskie 已提交
379 380 381 382
The response for a request contains the following information.

```js
{
M
mzabriskie 已提交
383 384 385 386 387
  // `data` is the response that was provided by the server
  data: {},

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

M
mzabriskie 已提交
389
  // `statusText` is the HTTP status message from the server response
M
mzabriskie 已提交
390
  statusText: 'OK',
M
mzabriskie 已提交
391 392

  // `headers` the headers that the server responded with
393
  // All header names are lower cased
M
mzabriskie 已提交
394 395 396
  headers: {},

  // `config` is the config that was provided to `axios` for the request
397 398 399 400 401 402
  config: {},

  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance the browser
  request: {}
M
mzabriskie 已提交
403 404 405
}
```

406
When using `then`, you will receive the response as follows:
M
Matt Zabriskie 已提交
407

M
Matt Zabriskie 已提交
408
```js
M
Matt Zabriskie 已提交
409
axios.get('/user/12345')
M
mzabriskie 已提交
410 411 412
  .then(function(response) {
    console.log(response.data);
    console.log(response.status);
M
mzabriskie 已提交
413
    console.log(response.statusText);
M
mzabriskie 已提交
414 415
    console.log(response.headers);
    console.log(response.config);
416
  });
M
mzabriskie 已提交
417 418
```

419 420
When using `catch`, or passing a [rejection callback](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) as second parameter of `then`, the response will be available through the `error` object as explained in the [Handling Errors](#handling-errors) section.

M
Matt Zabriskie 已提交
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
## Config Defaults

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

### Global axios defaults

```js
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

```js
// Set config defaults when creating the instance
437
const instance = axios.create({
M
Matt Zabriskie 已提交
438 439 440
  baseURL: 'https://api.example.com'
});

M
Marcelo Jorge Vieira 已提交
441
// Alter defaults after instance has been created
M
Matt Zabriskie 已提交
442 443 444 445 446
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
```

### Config order of precedence

M
MiguelMadero 已提交
447
Config will be merged with an order of precedence. The order is library defaults found in [lib/defaults.js](https://github.com/axios/axios/blob/master/lib/defaults.js#L28), then `defaults` property of the instance, and finally `config` argument for the request. The latter will take precedence over the former. Here's an example.
M
Matt Zabriskie 已提交
448 449 450 451

```js
// 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
452
const instance = axios.create();
M
Matt Zabriskie 已提交
453 454

// Override timeout default for the library
455
// Now all requests using this instance will wait 2.5 seconds before timing out
M
Matt Zabriskie 已提交
456 457 458 459 460
instance.defaults.timeout = 2500;

// Override timeout for this request as it's known to take a long time
instance.get('/longRequest', {
  timeout: 5000
461
});
M
Matt Zabriskie 已提交
462 463
```

M
mzabriskie 已提交
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
## Interceptors

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

```js
// 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 may need to remove an interceptor later you can.

```js
491
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
M
mzabriskie 已提交
492 493 494
axios.interceptors.request.eject(myInterceptor);
```

N
Nick Uraltsev 已提交
495 496 497
You can add interceptors to a custom instance of axios.

```js
498
const instance = axios.create();
N
Nick Uraltsev 已提交
499 500 501
instance.interceptors.request.use(function () {/*...*/});
```

M
mzabriskie 已提交
502 503 504 505
## Handling Errors

```js
axios.get('/user/12345')
N
Nick Uraltsev 已提交
506 507
  .catch(function (error) {
    if (error.response) {
508
      // The request was made and the server responded with a status code
M
mzabriskie 已提交
509
      // that falls out of the range of 2xx
N
Nick Uraltsev 已提交
510 511 512
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
513 514 515 516 517
    } else if (error.request) {
      // The request was made but no response was received
      // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
      // http.ClientRequest in node.js
      console.log(error.request);
N
Nick Uraltsev 已提交
518 519 520
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
M
mzabriskie 已提交
521
    }
N
Nick Uraltsev 已提交
522
    console.log(error.config);
M
mzabriskie 已提交
523
  });
M
mzabriskie 已提交
524 525
```

526 527 528 529 530 531 532 533 534 535
You can define a custom HTTP status code error range using the `validateStatus` config option.

```js
axios.get('/user/12345', {
  validateStatus: function (status) {
    return status < 500; // Reject only if the status code is greater than or equal to 500
  }
})
```

N
Nick Uraltsev 已提交
536 537 538 539
## Cancellation

You can cancel a request using a *cancel token*.

J
Jiri Spac 已提交
540
> The axios cancel token API is based on the withdrawn [cancelable promises proposal](https://github.com/tc39/proposal-cancelable-promises).
N
Nick Uraltsev 已提交
541

N
Nick Uraltsev 已提交
542
You can create a cancel token using the `CancelToken.source` factory as shown below:
N
Nick Uraltsev 已提交
543 544

```js
545 546
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
N
Nick Uraltsev 已提交
547 548

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
549
  cancelToken: source.token
N
Nick Uraltsev 已提交
550
}).catch(function(thrown) {
N
Nick Uraltsev 已提交
551
  if (axios.isCancel(thrown)) {
N
Nick Uraltsev 已提交
552 553 554 555 556 557
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

558 559 560 561 562
axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})
563 564

// cancel the request (the message parameter is optional)
N
Nick Uraltsev 已提交
565
source.cancel('Operation canceled by the user.');
N
Nick Uraltsev 已提交
566 567
```

N
Nick Uraltsev 已提交
568
You can also create a cancel token by passing an executor function to the `CancelToken` constructor:
N
Nick Uraltsev 已提交
569 570

```js
571 572
const CancelToken = axios.CancelToken;
let cancel;
N
Nick Uraltsev 已提交
573 574

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
575 576 577 578
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
N
Nick Uraltsev 已提交
579 580
});

N
Nick Uraltsev 已提交
581 582
// cancel the request
cancel();
N
Nick Uraltsev 已提交
583 584
```

N
Nick Uraltsev 已提交
585 586 587 588 589 590 591 592
> Note: you can cancel several requests with the same cancel token.

## 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 instead, you can use one of the following options.

### Browser

N
Nick Uraltsev 已提交
593
In a browser, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API as follows:
N
Nick Uraltsev 已提交
594 595

```js
596
const params = new URLSearchParams();
N
Nick Uraltsev 已提交
597 598
params.append('param1', 'value1');
params.append('param2', 'value2');
599
axios.post('/foo', params);
N
Nick Uraltsev 已提交
600 601
```

602
> Note that `URLSearchParams` is not supported by all browsers (see [caniuse.com](http://www.caniuse.com/#feat=urlsearchparams)), but there is a [polyfill](https://github.com/WebReflection/url-search-params) available (make sure to polyfill the global environment).
N
Nick Uraltsev 已提交
603 604 605 606

Alternatively, you can encode data using the [`qs`](https://github.com/ljharb/qs) library:

```js
607
const qs = require('qs');
Y
Yo'av Moshe 已提交
608
axios.post('/foo', qs.stringify({ 'bar': 123 }));
N
Nick Uraltsev 已提交
609 610
```

611 612 613 614 615 616 617 618 619 620 621 622 623 624
Or in another way (ES6),

```js
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);
```

N
Nick Uraltsev 已提交
625 626 627 628 629
### Node.js

In node.js, you can use the [`querystring`](https://nodejs.org/api/querystring.html) module as follows:

```js
630
const querystring = require('querystring');
631
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));
N
Nick Uraltsev 已提交
632 633
```

R
Robert Fridzema 已提交
634
You can also use the [`qs`](https://github.com/ljharb/qs) library.
635

M
mzabriskie 已提交
636 637 638 639 640 641 642 643 644 645
## Semver

Until axios reaches a `1.0` release, breaking changes will be released with a new minor version. For example `0.5.1`, and `0.5.4` will have the same API, but `0.6.0` will have breaking changes.

## Promises

axios depends on a native ES6 Promise implementation to be [supported](http://caniuse.com/promises).
If your environment doesn't support ES6 Promises, you can [polyfill](https://github.com/jakearchibald/es6-promise).

## TypeScript
N
Nick Uraltsev 已提交
646
axios includes [TypeScript](http://typescriptlang.org) definitions.
647
```typescript
N
Nick Uraltsev 已提交
648
import axios from 'axios';
649 650 651
axios.get('/user?ID=12345');
```

652 653
## Resources

N
Nick Uraltsev 已提交
654 655 656 657 658
* [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
* [Upgrade Guide](https://github.com/axios/axios/blob/master/UPGRADE_GUIDE.md)
* [Ecosystem](https://github.com/axios/axios/blob/master/ECOSYSTEM.md)
* [Contributing Guide](https://github.com/axios/axios/blob/master/CONTRIBUTING.md)
* [Code of Conduct](https://github.com/axios/axios/blob/master/CODE_OF_CONDUCT.md)
659

M
Matt Zabriskie 已提交
660
## Credits
M
Matt Zabriskie 已提交
661

M
Matt Zabriskie 已提交
662 663
axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http) provided in [Angular](https://angularjs.org/). Ultimately axios is an effort to provide a standalone `$http`-like service for use outside of Angular.

M
Matt Zabriskie 已提交
664 665
## License

666
MIT