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

[![npm version](https://img.shields.io/npm/v/axios.svg?style=flat-square)](https://www.npmjs.org/package/axios)
[![build status](https://img.shields.io/travis/mzabriskie/axios.svg?style=flat-square)](https://travis-ci.org/mzabriskie/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)
M
Matt Zabriskie 已提交
8

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

## Features

M
mzabriskie 已提交
13 14
- 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 已提交
15
- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API
M
mzabriskie 已提交
16
- Intercept request and response
M
mzabriskie 已提交
17
- Transform request and response data
N
Nick Uraltsev 已提交
18
- Cancel requests
M
Matt Zabriskie 已提交
19
- Automatic transforms for JSON data
M
mzabriskie 已提交
20
- Client side support for protecting against [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
M
Matt Zabriskie 已提交
21

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

24
![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://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Internet_Explorer_10_logo.svg/48px-Internet_Explorer_10_logo.svg.png) |
25 26
--- | --- | --- | --- | --- | --- |
Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |
M
mzabriskie 已提交
27

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

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

Using npm:

```bash
$ npm install axios
```

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

```bash
$ bower install axios
```

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

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

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

Performing a `GET` request

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

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

Performing a `POST` request

```js
axios.post('/user', {
M
mzabriskie 已提交
82 83 84 85 86 87
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
N
Nick Uraltsev 已提交
88 89
  .catch(function (error) {
    console.log(error);
M
mzabriskie 已提交
90
  });
M
Matt Zabriskie 已提交
91 92
```

M
Matt Zabriskie 已提交
93 94
Performing multiple concurrent requests

M
Matt Zabriskie 已提交
95
```js
M
Matt Zabriskie 已提交
96
function getUserAccount() {
M
mzabriskie 已提交
97
  return axios.get('/user/12345');
M
Matt Zabriskie 已提交
98 99 100
}

function getUserPermissions() {
M
mzabriskie 已提交
101
  return axios.get('/user/12345/permissions');
M
Matt Zabriskie 已提交
102 103 104
}

axios.all([getUserAccount(), getUserPermissions()])
M
mzabriskie 已提交
105 106 107
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));
M
Matt Zabriskie 已提交
108 109
```

M
mzabriskie 已提交
110
## axios API
M
Matt Zabriskie 已提交
111

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

M
Matt Zabriskie 已提交
114
##### axios(config)
M
Matt Zabriskie 已提交
115 116

```js
M
Matt Zabriskie 已提交
117
// Send a POST request
M
Matt Zabriskie 已提交
118
axios({
M
Matt Zabriskie 已提交
119 120 121 122 123 124
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
M
Matt Zabriskie 已提交
125 126 127
});
```

128 129 130 131 132 133 134 135 136 137 138 139
```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 已提交
140 141 142
##### axios(url[, config])

```js
J
Jamison Dance 已提交
143
// Send a GET request (default method)
M
Matt Zabriskie 已提交
144 145 146
axios('/user/12345');
```

M
Matt Zabriskie 已提交
147 148 149 150
### Request method aliases

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

151
##### axios.request(config)
M
Matt Zabriskie 已提交
152 153 154 155 156 157
##### 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]])
M
Matt Zabriskie 已提交
158 159

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

M
Matt Zabriskie 已提交
162 163
### Concurrency

M
Matt Zabriskie 已提交
164 165
Helper functions for dealing with concurrent requests.

M
Matt Zabriskie 已提交
166 167 168
##### axios.all(iterable)
##### axios.spread(callback)

N
Nick Uraltsev 已提交
169 170 171 172 173 174 175 176
### Creating an instance

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

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

```js
var instance = axios.create({
177
  baseURL: 'https://some-domain.com/api/',
N
Nick Uraltsev 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
  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]])

M
Matt Zabriskie 已提交
195
## Request Config
M
Matt Zabriskie 已提交
196

N
Nick Uraltsev 已提交
197
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 已提交
198

M
Matt Zabriskie 已提交
199 200
```js
{
M
mzabriskie 已提交
201 202
  // `url` is the server URL that will be used for the request
  url: '/user',
203

204 205 206
  // `method` is the request method to be used when making the request
  method: 'get', // default

207 208
  // `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
209 210
  // to methods of that instance.
  baseURL: 'https://some-domain.com/api/',
M
mzabriskie 已提交
211 212 213

  // `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'
N
Nick Uraltsev 已提交
214
  // The last function in the array must return a string, an ArrayBuffer, or a Stream
M
mzabriskie 已提交
215 216
  transformRequest: [function (data) {
    // Do whatever you want to transform the data
217

M
mzabriskie 已提交
218 219 220 221 222 223 224
    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
225

M
mzabriskie 已提交
226 227 228 229 230 231
    return data;
  }],

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

R
rupertrutland 已提交
232
  // `params` are the URL parameters to be sent with the request
233
  // Must be a plain object or a URLSearchParams object
M
mzabriskie 已提交
234 235 236
  params: {
    ID: 12345
  },
237 238 239 240 241 242

  // `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 已提交
243 244 245

  // `data` is the data to be sent as the request body
  // Only applicable for request methods 'PUT', 'POST', and 'PATCH'
246 247 248 249
  // When no `transformRequest` is set, must be of one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser only: FormData, File, Blob
  // - Node only: Stream
M
mzabriskie 已提交
250 251 252 253
  data: {
    firstName: 'Fred'
  },

M
mzabriskie 已提交
254 255 256 257
  // `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 已提交
258 259 260 261
  // `withCredentials` indicates whether or not cross-site Access-Control requests
  // should be made using credentials
  withCredentials: false, // default

262
  // `adapter` allows custom handling of requests which makes testing easier.
N
Nick Uraltsev 已提交
263
  // Return a promise and supply a valid response (see lib/adapters/README.md).
264
  adapter: function (config) {
265 266 267
    /* ... */
  },

268
  // `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
269 270
  // This will set an `Authorization` header, overwriting any existing
  // `Authorization` custom headers you have set using `headers`.
271
  auth: {
I
Idan Gazit 已提交
272 273
    username: 'janedoe',
    password: 's00pers3cret'
A
Andy Kogut 已提交
274
  },
275

M
mzabriskie 已提交
276
  // `responseType` indicates the type of data that the server will respond with
N
Nick Uraltsev 已提交
277
  // options are 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
M
mzabriskie 已提交
278 279 280 281 282 283
  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
284 285
  xsrfHeaderName: 'X-XSRF-TOKEN', // default

286 287 288 289 290 291 292
  // `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) {
293
    // Do whatever you want with the native progress event
294
  },
295

296
  // `maxContentLength` defines the max size of the http response content allowed
297 298 299 300 301 302 303 304
  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 已提交
305 306 307 308
  },

  // `maxRedirects` defines the maximum number of redirects to follow in node.js.
  // If set to 0, no redirects will be followed.
309 310 311 312 313 314
  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 to configure options like
  // `keepAlive` that are not enabled by default.
  httpAgent: new http.Agent({ keepAlive: true }),
315 316 317
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' defines the hostname and port of the proxy server
M
Marc Mignonsin 已提交
318 319
  // `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`.
320 321
  proxy: {
    host: '127.0.0.1',
M
Marc Mignonsin 已提交
322 323 324 325 326
    port: 9000,
    auth: : {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
N
Nick Uraltsev 已提交
327 328 329 330 331 332
  },

  // `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 已提交
333 334 335
}
```

M
Matt Zabriskie 已提交
336
## Response Schema
M
Matt Zabriskie 已提交
337

M
mzabriskie 已提交
338 339 340 341
The response for a request contains the following information.

```js
{
M
mzabriskie 已提交
342 343 344 345 346
  // `data` is the response that was provided by the server
  data: {},

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

M
mzabriskie 已提交
348
  // `statusText` is the HTTP status message from the server response
M
mzabriskie 已提交
349
  statusText: 'OK',
M
mzabriskie 已提交
350 351 352 353 354 355

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

  // `config` is the config that was provided to `axios` for the request
  config: {}
M
mzabriskie 已提交
356 357 358
}
```

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

M
Matt Zabriskie 已提交
361
```js
M
Matt Zabriskie 已提交
362
axios.get('/user/12345')
M
mzabriskie 已提交
363 364 365
  .then(function(response) {
    console.log(response.data);
    console.log(response.status);
M
mzabriskie 已提交
366
    console.log(response.statusText);
M
mzabriskie 已提交
367 368
    console.log(response.headers);
    console.log(response.config);
369
  });
M
mzabriskie 已提交
370 371
```

372 373
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 已提交
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
## 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 已提交
394
// Alter defaults after instance has been created
M
Matt Zabriskie 已提交
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
```

### Config order of precedence

Config will be merged with an order of precedence. The order is library defaults found in `lib/defaults.js`, 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.

```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
// Now all requests 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
414
});
M
Matt Zabriskie 已提交
415 416
```

M
mzabriskie 已提交
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
## 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 已提交
448 449 450 451 452 453 454
You can add interceptors to a custom instance of axios.

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

M
mzabriskie 已提交
455 456 457 458
## Handling Errors

```js
axios.get('/user/12345')
N
Nick Uraltsev 已提交
459 460
  .catch(function (error) {
    if (error.response) {
M
mzabriskie 已提交
461 462
      // The request was made, but the server responded with a status code
      // that falls out of the range of 2xx
N
Nick Uraltsev 已提交
463 464 465 466 467 468
      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);
M
mzabriskie 已提交
469
    }
N
Nick Uraltsev 已提交
470
    console.log(error.config);
M
mzabriskie 已提交
471
  });
M
mzabriskie 已提交
472 473
```

474 475 476 477 478 479 480 481 482 483
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 已提交
484 485 486 487
## Cancellation

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

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

N
Nick Uraltsev 已提交
490
You can create a cancel token using the `CancelToken.source` factory as shown below:
N
Nick Uraltsev 已提交
491 492 493

```js
var CancelToken = axios.CancelToken;
N
Nick Uraltsev 已提交
494
var source = CancelToken.source();
N
Nick Uraltsev 已提交
495 496

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
497
  cancelToken: source.token
N
Nick Uraltsev 已提交
498
}).catch(function(thrown) {
N
Nick Uraltsev 已提交
499
  if (axios.isCancel(thrown)) {
N
Nick Uraltsev 已提交
500 501 502 503 504 505 506
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

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

N
Nick Uraltsev 已提交
510
You can also create a cancel token by passing an executor function to the `CancelToken` constructor:
N
Nick Uraltsev 已提交
511 512 513

```js
var CancelToken = axios.CancelToken;
N
Nick Uraltsev 已提交
514
var cancel;
N
Nick Uraltsev 已提交
515 516

axios.get('/user/12345', {
N
Nick Uraltsev 已提交
517 518 519 520
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
N
Nick Uraltsev 已提交
521 522
});

N
Nick Uraltsev 已提交
523 524
// cancel the request
cancel();
N
Nick Uraltsev 已提交
525 526
```

N
Nick Uraltsev 已提交
527 528 529 530 531 532 533 534
> 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 已提交
535
In a browser, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API as follows:
N
Nick Uraltsev 已提交
536 537 538 539 540

```js
var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
541
axios.post('/foo', params);
N
Nick Uraltsev 已提交
542 543 544 545 546 547 548 549
```

> Note that `URLSearchParams` is not supported by all browsers, but there is a [polyfill](https://github.com/WebReflection/url-search-params) available (make sure to polyfill the global environment).

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

```js
var qs = require('qs');
Y
Yo'av Moshe 已提交
550
axios.post('/foo', qs.stringify({ 'bar': 123 }));
N
Nick Uraltsev 已提交
551 552 553 554 555 556 557 558
```

### Node.js

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

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

You can also use the `qs` library.
563

M
mzabriskie 已提交
564 565 566 567 568 569 570 571 572 573
## 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 已提交
574
axios includes [TypeScript](http://typescriptlang.org) definitions.
575
```typescript
N
Nick Uraltsev 已提交
576
import axios from 'axios';
577 578 579
axios.get('/user?ID=12345');
```

580 581 582
## Resources

* [Changelog](https://github.com/mzabriskie/axios/blob/master/CHANGELOG.md)
N
Nick Uraltsev 已提交
583
* [Upgrade Guide](https://github.com/mzabriskie/axios/blob/master/UPGRADE_GUIDE.md)
584 585 586 587
* [Ecosystem](https://github.com/mzabriskie/axios/blob/master/ECOSYSTEM.md)
* [Contributing Guide](https://github.com/mzabriskie/axios/blob/master/CONTRIBUTING.md)
* [Code of Conduct](https://github.com/mzabriskie/axios/blob/master/CODE_OF_CONDUCT.md)

M
Matt Zabriskie 已提交
588
## Credits
M
Matt Zabriskie 已提交
589

M
Matt Zabriskie 已提交
590 591
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 已提交
592 593
## License

594
MIT