README.md 19.8 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 ✔ | 8+ ✔ |
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 56 57
## Example

Performing a `GET` request

```js
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
M
mzabriskie 已提交
58 59 60
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
61 62
  .catch(function (error) {
    console.log(error);
M
mzabriskie 已提交
63
  });
64

M
Matt Zabriskie 已提交
65 66
// Optionally the request above could also be done as
axios.get('/user', {
M
mzabriskie 已提交
67 68 69 70 71 72 73
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
74 75
  .catch(function (error) {
    console.log(error);
M
mzabriskie 已提交
76
  });
77

D
Deric Cain 已提交
78 79
// Want to use async/await? Add the `async` keyword to your outer function/method.
async function getUser() {
D
Deric Cain 已提交
80
  try {
D
Deric Cain 已提交
81
    const response = await axios.get('/user?ID=12345');
D
Deric Cain 已提交
82 83
    console.log(response);
  } catch (error) {
D
Deric Cain 已提交
84
    console.error(error);
D
Deric Cain 已提交
85
  }
D
Deric Cain 已提交
86
}
M
Matt Zabriskie 已提交
87 88
```

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

M
Matt Zabriskie 已提交
92 93 94 95
Performing a `POST` request

```js
axios.post('/user', {
M
mzabriskie 已提交
96 97 98 99 100 101
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
102 103
  .catch(function (error) {
    console.log(error);
M
mzabriskie 已提交
104
  });
M
Matt Zabriskie 已提交
105 106
```

M
Matt Zabriskie 已提交
107 108
Performing multiple concurrent requests

M
Matt Zabriskie 已提交
109
```js
M
Matt Zabriskie 已提交
110
function getUserAccount() {
M
mzabriskie 已提交
111
  return axios.get('/user/12345');
M
Matt Zabriskie 已提交
112 113 114
}

function getUserPermissions() {
M
mzabriskie 已提交
115
  return axios.get('/user/12345/permissions');
M
Matt Zabriskie 已提交
116 117 118
}

axios.all([getUserAccount(), getUserPermissions()])
M
mzabriskie 已提交
119 120 121
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));
M
Matt Zabriskie 已提交
122 123
```

M
mzabriskie 已提交
124
## axios API
M
Matt Zabriskie 已提交
125

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

M
Matt Zabriskie 已提交
128
##### axios(config)
M
Matt Zabriskie 已提交
129 130

```js
M
Matt Zabriskie 已提交
131
// Send a POST request
M
Matt Zabriskie 已提交
132
axios({
M
Matt Zabriskie 已提交
133 134 135 136 137 138
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
M
Matt Zabriskie 已提交
139 140 141
});
```

142 143 144 145 146 147 148 149 150 151 152 153
```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 已提交
154 155 156
##### axios(url[, config])

```js
J
Jamison Dance 已提交
157
// Send a GET request (default method)
M
Matt Zabriskie 已提交
158 159 160
axios('/user/12345');
```

M
Matt Zabriskie 已提交
161 162 163 164
### Request method aliases

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

165
##### axios.request(config)
M
Matt Zabriskie 已提交
166 167 168
##### axios.get(url[, config])
##### axios.delete(url[, config])
##### axios.head(url[, config])
169
##### axios.options(url[, config])
M
Matt Zabriskie 已提交
170 171 172
##### axios.post(url[, data[, config]])
##### axios.put(url[, data[, config]])
##### axios.patch(url[, data[, config]])
M
Matt Zabriskie 已提交
173 174

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

M
Matt Zabriskie 已提交
177 178
### Concurrency

M
Matt Zabriskie 已提交
179 180
Helper functions for dealing with concurrent requests.

M
Matt Zabriskie 已提交
181 182 183
##### axios.all(iterable)
##### axios.spread(callback)

N
Nick Uraltsev 已提交
184 185 186 187 188 189 190 191
### Creating an instance

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

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

```js
var instance = axios.create({
192
  baseURL: 'https://some-domain.com/api/',
N
Nick Uraltsev 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205
  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])
206
##### axios#options(url[, config])
N
Nick Uraltsev 已提交
207 208 209 210
##### axios#post(url[, data[, config]])
##### axios#put(url[, data[, config]])
##### axios#patch(url[, data[, config]])

M
Matt Zabriskie 已提交
211
## Request Config
M
Matt Zabriskie 已提交
212

N
Nick Uraltsev 已提交
213
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 已提交
214

M
Matt Zabriskie 已提交
215 216
```js
{
M
mzabriskie 已提交
217 218
  // `url` is the server URL that will be used for the request
  url: '/user',
219

220 221 222
  // `method` is the request method to be used when making the request
  method: 'get', // default

223 224
  // `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
225 226
  // to methods of that instance.
  baseURL: 'https://some-domain.com/api/',
M
mzabriskie 已提交
227 228 229

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

M
mzabriskie 已提交
236 237 238 239 240 241 242
    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
243

M
mzabriskie 已提交
244 245 246 247 248 249
    return data;
  }],

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

R
rupertrutland 已提交
250
  // `params` are the URL parameters to be sent with the request
251
  // Must be a plain object or a URLSearchParams object
M
mzabriskie 已提交
252 253 254
  params: {
    ID: 12345
  },
255 256 257 258 259 260

  // `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 已提交
261 262 263

  // `data` is the data to be sent as the request body
  // Only applicable for request methods 'PUT', 'POST', and 'PATCH'
264 265 266
  // When no `transformRequest` is set, must be of one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser only: FormData, File, Blob
267
  // - Node only: Stream, Buffer
M
mzabriskie 已提交
268 269 270 271
  data: {
    firstName: 'Fred'
  },

M
mzabriskie 已提交
272 273 274 275
  // `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 已提交
276 277 278 279
  // `withCredentials` indicates whether or not cross-site Access-Control requests
  // should be made using credentials
  withCredentials: false, // default

280
  // `adapter` allows custom handling of requests which makes testing easier.
N
Nick Uraltsev 已提交
281
  // Return a promise and supply a valid response (see lib/adapters/README.md).
282
  adapter: function (config) {
283 284 285
    /* ... */
  },

286
  // `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
287 288
  // This will set an `Authorization` header, overwriting any existing
  // `Authorization` custom headers you have set using `headers`.
289
  auth: {
I
Idan Gazit 已提交
290 291
    username: 'janedoe',
    password: 's00pers3cret'
A
Andy Kogut 已提交
292
  },
293

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

298 299 300 301
  // `responseEncoding` indicates encoding to use for decoding responses
  // Note: Ignored for `responseType` of 'stream' or client-side requests
  responseEncoding: 'utf8', // default

M
mzabriskie 已提交
302 303 304 305
  // `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
306 307
  xsrfHeaderName: 'X-XSRF-TOKEN', // default

308 309 310 311 312 313 314
  // `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) {
315
    // Do whatever you want with the native progress event
316
  },
317

318
  // `maxContentLength` defines the max size of the http response content allowed
319 320 321 322 323 324 325 326
  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 已提交
327 328 329 330
  },

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

S
Starfox64 已提交
333 334
  // `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 已提交
335 336
  // Only either `socketPath` or `proxy` can be specified.
  // If both are specified, `socketPath` is used.
S
Starfox64 已提交
337 338
  socketPath: null, // default

339
  // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
340
  // and https requests, respectively, in node.js. This allows options to be added like
341 342
  // `keepAlive` that are not enabled by default.
  httpAgent: new http.Agent({ keepAlive: true }),
343 344 345
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' defines the hostname and port of the proxy server
346
  // Use `false` to disable proxies, ignoring environment variables.
347 348 349 350
  // `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`.
351 352
  proxy: {
    host: '127.0.0.1',
M
Marc Mignonsin 已提交
353
    port: 9000,
354
    auth: {
M
Marc Mignonsin 已提交
355 356 357
      username: 'mikeymike',
      password: 'rapunz3l'
    }
N
Nick Uraltsev 已提交
358 359 360 361 362 363
  },

  // `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 已提交
364 365 366
}
```

M
Matt Zabriskie 已提交
367
## Response Schema
M
Matt Zabriskie 已提交
368

M
mzabriskie 已提交
369 370 371 372
The response for a request contains the following information.

```js
{
M
mzabriskie 已提交
373 374 375 376 377
  // `data` is the response that was provided by the server
  data: {},

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

M
mzabriskie 已提交
379
  // `statusText` is the HTTP status message from the server response
M
mzabriskie 已提交
380
  statusText: 'OK',
M
mzabriskie 已提交
381 382

  // `headers` the headers that the server responded with
383
  // All header names are lower cased
M
mzabriskie 已提交
384 385 386
  headers: {},

  // `config` is the config that was provided to `axios` for the request
387 388 389 390 391 392
  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 已提交
393 394 395
}
```

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

M
Matt Zabriskie 已提交
398
```js
M
Matt Zabriskie 已提交
399
axios.get('/user/12345')
M
mzabriskie 已提交
400 401 402
  .then(function(response) {
    console.log(response.data);
    console.log(response.status);
M
mzabriskie 已提交
403
    console.log(response.statusText);
M
mzabriskie 已提交
404 405
    console.log(response.headers);
    console.log(response.config);
406
  });
M
mzabriskie 已提交
407 408
```

409 410
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 已提交
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
## 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
var instance = axios.create({
  baseURL: 'https://api.example.com'
});

M
Marcelo Jorge Vieira 已提交
431
// Alter defaults after instance has been created
M
Matt Zabriskie 已提交
432 433 434 435 436
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
```

### Config order of precedence

M
MiguelMadero 已提交
437
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 已提交
438 439 440 441 442 443 444

```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
var instance = axios.create();

// Override timeout default for the library
445
// Now all requests using this instance will wait 2.5 seconds before timing out
M
Matt Zabriskie 已提交
446 447 448 449 450
instance.defaults.timeout = 2500;

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

M
mzabriskie 已提交
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
## 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
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
```

N
Nick Uraltsev 已提交
485 486 487 488 489 490 491
You can add interceptors to a custom instance of axios.

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

M
mzabriskie 已提交
492 493 494 495
## Handling Errors

```js
axios.get('/user/12345')
N
Nick Uraltsev 已提交
496 497
  .catch(function (error) {
    if (error.response) {
498
      // The request was made and the server responded with a status code
M
mzabriskie 已提交
499
      // that falls out of the range of 2xx
N
Nick Uraltsev 已提交
500 501 502
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
503 504 505 506 507
    } 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 已提交
508 509 510
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
M
mzabriskie 已提交
511
    }
N
Nick Uraltsev 已提交
512
    console.log(error.config);
M
mzabriskie 已提交
513
  });
M
mzabriskie 已提交
514 515
```

516 517 518 519 520 521 522 523 524 525
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 已提交
526 527 528 529
## Cancellation

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

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

N
Nick Uraltsev 已提交
532
You can create a cancel token using the `CancelToken.source` factory as shown below:
N
Nick Uraltsev 已提交
533 534 535

```js
var CancelToken = axios.CancelToken;
N
Nick Uraltsev 已提交
536
var source = CancelToken.source();
N
Nick Uraltsev 已提交
537 538

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
539
  cancelToken: source.token
N
Nick Uraltsev 已提交
540
}).catch(function(thrown) {
N
Nick Uraltsev 已提交
541
  if (axios.isCancel(thrown)) {
N
Nick Uraltsev 已提交
542 543 544 545 546 547
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

548 549 550 551 552
axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})
553 554

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

N
Nick Uraltsev 已提交
558
You can also create a cancel token by passing an executor function to the `CancelToken` constructor:
N
Nick Uraltsev 已提交
559 560 561

```js
var CancelToken = axios.CancelToken;
N
Nick Uraltsev 已提交
562
var cancel;
N
Nick Uraltsev 已提交
563 564

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
565 566 567 568
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
N
Nick Uraltsev 已提交
569 570
});

N
Nick Uraltsev 已提交
571 572
// cancel the request
cancel();
N
Nick Uraltsev 已提交
573 574
```

N
Nick Uraltsev 已提交
575 576 577 578 579 580 581 582
> 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 已提交
583
In a browser, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API as follows:
N
Nick Uraltsev 已提交
584 585 586 587 588

```js
var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
589
axios.post('/foo', params);
N
Nick Uraltsev 已提交
590 591
```

592
> 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 已提交
593 594 595 596 597

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

```js
var qs = require('qs');
Y
Yo'av Moshe 已提交
598
axios.post('/foo', qs.stringify({ 'bar': 123 }));
N
Nick Uraltsev 已提交
599 600 601 602 603 604 605 606
```

### Node.js

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

```js
var querystring = require('querystring');
607
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));
N
Nick Uraltsev 已提交
608 609
```

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

M
mzabriskie 已提交
612 613 614 615 616 617 618 619 620 621
## 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 已提交
622
axios includes [TypeScript](http://typescriptlang.org) definitions.
623
```typescript
N
Nick Uraltsev 已提交
624
import axios from 'axios';
625 626 627
axios.get('/user?ID=12345');
```

628 629
## Resources

N
Nick Uraltsev 已提交
630 631 632 633 634
* [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)
635

M
Matt Zabriskie 已提交
636
## Credits
M
Matt Zabriskie 已提交
637

M
Matt Zabriskie 已提交
638 639
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 已提交
640 641
## License

642
MIT