axios 1.16.1 β 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +94 -1
- package/README.md +267 -239
- package/dist/axios.js +454 -146
- package/dist/axios.min.js +3 -3
- package/dist/axios.min.js.map +1 -1
- package/dist/browser/axios.cjs +470 -99
- package/dist/esm/axios.js +470 -99
- package/dist/esm/axios.min.js +2 -2
- package/dist/esm/axios.min.js.map +1 -1
- package/dist/node/axios.cjs +638 -201
- package/index.d.cts +10 -3
- package/index.d.ts +6 -1
- package/lib/adapters/fetch.js +190 -35
- package/lib/adapters/http.js +192 -159
- package/lib/core/Axios.js +4 -2
- package/lib/core/AxiosHeaders.js +12 -9
- package/lib/core/buildFullPath.js +29 -1
- package/lib/core/mergeConfig.js +34 -0
- package/lib/defaults/transitional.js +2 -0
- package/lib/env/data.js +1 -1
- package/lib/helpers/Http2Sessions.js +119 -0
- package/lib/helpers/buildURL.js +6 -4
- package/lib/helpers/estimateDataURLDecodedBytes.js +16 -11
- package/lib/helpers/formDataToJSON.js +25 -3
- package/lib/helpers/formDataToStream.js +2 -2
- package/lib/helpers/resolveConfig.js +17 -9
- package/lib/helpers/shouldBypassProxy.js +33 -1
- package/lib/helpers/toFormData.js +41 -11
- package/lib/utils.js +97 -12
- package/package.json +29 -13
- package/dist/axios.js.map +0 -1
- package/dist/browser/axios.cjs.map +0 -1
- package/dist/esm/axios.js.map +0 -1
- package/dist/node/axios.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -29,27 +29,10 @@
|
|
|
29
29
|
</td>
|
|
30
30
|
<td align="center" width="50%">
|
|
31
31
|
<a
|
|
32
|
-
href="https://
|
|
33
|
-
style="padding: 10px; display: inline-block"
|
|
32
|
+
href="https://opencollective.com/axios/contribute"
|
|
34
33
|
target="_blank"
|
|
34
|
+
>π Become a sponsor</a
|
|
35
35
|
>
|
|
36
|
-
<img
|
|
37
|
-
width="90px"
|
|
38
|
-
height="90px"
|
|
39
|
-
src="https://images.opencollective.com/hopper-security/c4f7de2/avatar.png"
|
|
40
|
-
alt="Hopper Security"
|
|
41
|
-
/>
|
|
42
|
-
</a>
|
|
43
|
-
<p align="center">
|
|
44
|
-
Hopper provides a secure, open-source registry where every component is verified against malware and continuously remediated for vulnerabilities across all versions. In simple terms, Hopper removes the need to manage software supply chain risk altogether.
|
|
45
|
-
</p>
|
|
46
|
-
<p align="center">
|
|
47
|
-
<a
|
|
48
|
-
href="https://hopper.security/?utm_source=axios&utm_medium=readme_sponsorlist&utm_campaign=sponsorship"
|
|
49
|
-
target="_blank"
|
|
50
|
-
><b>hopper.security</b></a
|
|
51
|
-
>
|
|
52
|
-
</p>
|
|
53
36
|
</td>
|
|
54
37
|
</tr>
|
|
55
38
|
</table>
|
|
@@ -142,7 +125,7 @@
|
|
|
142
125
|
</a>
|
|
143
126
|
<p
|
|
144
127
|
align="center"
|
|
145
|
-
title="Hi, we're Descope! We are building something in the authentication space for app developers and can
|
|
128
|
+
title="Hi, we're Descope! We are building something in the authentication space for app developers and can't wait to place it in your hands."
|
|
146
129
|
>
|
|
147
130
|
Reduce user friction, prevent account takeover, and get a 360Β° view of your customer and agentic identities with the Descope External IAM platform.
|
|
148
131
|
</p>
|
|
@@ -250,7 +233,7 @@
|
|
|
250
233
|
<p
|
|
251
234
|
align="center"
|
|
252
235
|
>
|
|
253
|
-
At Buzzoid, you can buy Instagram followers
|
|
236
|
+
At Buzzoid, you can buy Instagram followers through a short checkout flow with safety controls. Rated world's #1 IG service since 2012.
|
|
254
237
|
</p>
|
|
255
238
|
<p align="center">
|
|
256
239
|
<a
|
|
@@ -288,10 +271,29 @@
|
|
|
288
271
|
</td>
|
|
289
272
|
<td align="center" width="33.333333333333336%">
|
|
290
273
|
<a
|
|
291
|
-
href="https://
|
|
274
|
+
href="https://global.fun88.com/?utm_source=axios_docs_website&utm_medium=website&utm_campaign=axios_open_collective_sponsorship"
|
|
275
|
+
style="padding: 10px; display: inline-block"
|
|
292
276
|
target="_blank"
|
|
293
|
-
>π Become a sponsor</a
|
|
294
277
|
>
|
|
278
|
+
<img
|
|
279
|
+
width="71px"
|
|
280
|
+
height="70px"
|
|
281
|
+
src="https://images.opencollective.com/fun88-official/bf2843c/logo.png"
|
|
282
|
+
alt="Fun 88"
|
|
283
|
+
/>
|
|
284
|
+
</a>
|
|
285
|
+
<p
|
|
286
|
+
align="center"
|
|
287
|
+
>
|
|
288
|
+
Fun88 is a global online gambling and betting brand founded in 2009, offering a wide range of services including sports betting, live casino games, slots, and virtual gaming.
|
|
289
|
+
</p>
|
|
290
|
+
<p align="center">
|
|
291
|
+
<a
|
|
292
|
+
href="https://global.fun88.com/?utm_source=axios_docs_website&utm_medium=website&utm_campaign=axios_open_collective_sponsorship"
|
|
293
|
+
target="_blank"
|
|
294
|
+
><b>global.fun88.com</b></a
|
|
295
|
+
>
|
|
296
|
+
</p>
|
|
295
297
|
</td>
|
|
296
298
|
</tr>
|
|
297
299
|
</table>
|
|
@@ -315,62 +317,61 @@
|
|
|
315
317
|
<div align="center">
|
|
316
318
|
|
|
317
319
|
[](https://www.npmjs.org/package/axios)
|
|
318
|
-
[](https://cdnjs.com/libraries/axios)
|
|
319
320
|
[](https://github.com/axios/axios/actions/workflows/ci.yml)
|
|
320
321
|
[](https://gitpod.io/#https://github.com/axios/axios)
|
|
321
|
-
[](https://coveralls.io/r/mzabriskie/axios)
|
|
322
322
|
[](https://packagephobia.now.sh/result?p=axios)
|
|
323
323
|
[](https://bundlephobia.com/package/axios@latest)
|
|
324
324
|
[](https://npm-stat.com/charts.html?package=axios)
|
|
325
325
|
[](https://gitter.im/mzabriskie/axios)
|
|
326
326
|
[](https://www.codetriage.com/axios/axios)
|
|
327
327
|
[](CONTRIBUTORS.md)
|
|
328
|
+
[](https://agentfriendlycode.com/repo/32)
|
|
328
329
|
|
|
329
330
|
</div>
|
|
330
331
|
|
|
331
|
-
## Table of
|
|
332
|
+
## Table of contents
|
|
332
333
|
|
|
333
334
|
- [Features](#features)
|
|
334
|
-
- [Browser
|
|
335
|
+
- [Browser support](#browser-support)
|
|
335
336
|
- [Installing](#installing)
|
|
336
337
|
- [Package manager](#package-manager)
|
|
337
338
|
- [CDN](#cdn)
|
|
338
339
|
- [Example](#example)
|
|
339
340
|
- [Axios API](#axios-api)
|
|
340
341
|
- [Request method aliases](#request-method-aliases)
|
|
341
|
-
- [Concurrency
|
|
342
|
+
- [Concurrency](#concurrency-deprecated)
|
|
342
343
|
- [Creating an instance](#creating-an-instance)
|
|
343
344
|
- [Instance methods](#instance-methods)
|
|
344
|
-
- [Request
|
|
345
|
-
- [Response
|
|
346
|
-
- [Config
|
|
345
|
+
- [Request config](#request-config)
|
|
346
|
+
- [Response schema](#response-schema)
|
|
347
|
+
- [Config defaults](#config-defaults)
|
|
347
348
|
- [Global axios defaults](#global-axios-defaults)
|
|
348
349
|
- [Custom instance defaults](#custom-instance-defaults)
|
|
349
350
|
- [Config order of precedence](#config-order-of-precedence)
|
|
350
351
|
- [Interceptors](#interceptors)
|
|
351
|
-
- [Multiple
|
|
352
|
-
- [Handling
|
|
353
|
-
- [Handling
|
|
352
|
+
- [Multiple interceptors](#multiple-interceptors)
|
|
353
|
+
- [Handling errors](#handling-errors)
|
|
354
|
+
- [Handling timeouts](#handling-timeouts)
|
|
354
355
|
- [Cancellation](#cancellation)
|
|
355
356
|
- [AbortController](#abortcontroller)
|
|
356
|
-
- [CancelToken
|
|
357
|
+
- [CancelToken](#canceltoken-deprecated)
|
|
357
358
|
- [Using application/x-www-form-urlencoded format](#using-applicationx-www-form-urlencoded-format)
|
|
358
359
|
- [URLSearchParams](#urlsearchparams)
|
|
359
360
|
- [Query string](#query-string-older-browsers)
|
|
360
|
-
- [
|
|
361
|
+
- [Automatic serialization](#automatic-serialization-to-urlsearchparams)
|
|
361
362
|
- [Using multipart/form-data format](#using-multipartform-data-format)
|
|
362
363
|
- [FormData](#formdata)
|
|
363
|
-
- [
|
|
364
|
-
- [
|
|
365
|
-
- [HTML
|
|
366
|
-
- [
|
|
367
|
-
- [
|
|
368
|
-
- [
|
|
369
|
-
- [
|
|
370
|
-
- [
|
|
371
|
-
- [
|
|
372
|
-
- [
|
|
373
|
-
- [
|
|
364
|
+
- [Automatic serialization](#automatic-serialization-to-formdata)
|
|
365
|
+
- [Posting files](#posting-files)
|
|
366
|
+
- [HTML form posting](#html-form-posting-browser)
|
|
367
|
+
- [Progress capturing](#progress-capturing)
|
|
368
|
+
- [Rate limiting](#rate-limiting)
|
|
369
|
+
- [AxiosHeaders](#axiosheaders)
|
|
370
|
+
- [Fetch adapter](#fetch-adapter)
|
|
371
|
+
- [Custom fetch](#custom-fetch)
|
|
372
|
+
- [Using with Tauri](#using-with-tauri)
|
|
373
|
+
- [Using with SvelteKit](#using-with-sveltekit)
|
|
374
|
+
- [HTTP/2 support](#http2-support)
|
|
374
375
|
- [Semver](#semver)
|
|
375
376
|
- [Promises](#promises)
|
|
376
377
|
- [TypeScript](#typescript)
|
|
@@ -382,17 +383,17 @@
|
|
|
382
383
|
|
|
383
384
|
## Features
|
|
384
385
|
|
|
385
|
-
-
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
389
|
-
-
|
|
390
|
-
-
|
|
391
|
-
-
|
|
392
|
-
-
|
|
393
|
-
-
|
|
386
|
+
- Make [XMLHttpRequests](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) from the browser.
|
|
387
|
+
- Make [http](https://nodejs.org/api/http.html) requests from Node.js.
|
|
388
|
+
- Use the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API for asynchronous request handling.
|
|
389
|
+
- Intercept requests and responses to add custom logic or transform data.
|
|
390
|
+
- Transform request and response data.
|
|
391
|
+
- Cancel requests with built-in cancellation APIs.
|
|
392
|
+
- Serialize and parse [JSON](https://www.json.org/json-en.html) data.
|
|
393
|
+
- Serialize data objects to `multipart/form-data` or `application/x-www-form-urlencoded`.
|
|
394
|
+
- Add client-side protection against [Cross-Site Request Forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery).
|
|
394
395
|
|
|
395
|
-
## Browser
|
|
396
|
+
## Browser support
|
|
396
397
|
|
|
397
398
|
| Chrome | Firefox | Safari | Opera | Edge |
|
|
398
399
|
| :------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: |
|
|
@@ -429,7 +430,7 @@ Using bun:
|
|
|
429
430
|
$ bun add axios
|
|
430
431
|
```
|
|
431
432
|
|
|
432
|
-
Once the package is installed,
|
|
433
|
+
Once the package is installed, import it with `import` or `require`:
|
|
433
434
|
|
|
434
435
|
```js
|
|
435
436
|
import axios, { isCancel, AxiosError } from 'axios';
|
|
@@ -451,14 +452,13 @@ const axios = require('axios');
|
|
|
451
452
|
console.log(axios.isCancel('something'));
|
|
452
453
|
```
|
|
453
454
|
|
|
454
|
-
|
|
455
|
+
Some bundlers and ES6 linters need this form:
|
|
455
456
|
|
|
456
457
|
```js
|
|
457
458
|
import { default as axios } from 'axios';
|
|
458
459
|
```
|
|
459
460
|
|
|
460
|
-
|
|
461
|
-
you can try importing the module package directly:
|
|
461
|
+
In custom or legacy environments, you can import the bundle directly:
|
|
462
462
|
|
|
463
463
|
```js
|
|
464
464
|
const axios = require('axios/dist/browser/axios.cjs'); // browser commonJS bundle (ES2017)
|
|
@@ -498,7 +498,7 @@ axios
|
|
|
498
498
|
params: {
|
|
499
499
|
ID: 12345,
|
|
500
500
|
},
|
|
501
|
-
timeout: 5000, // 5 seconds
|
|
501
|
+
timeout: 5000, // 5 seconds. See "Handling Timeouts" below for matching error handling
|
|
502
502
|
})
|
|
503
503
|
.then(function (response) {
|
|
504
504
|
console.log(response);
|
|
@@ -529,10 +529,10 @@ console.log(response);
|
|
|
529
529
|
}
|
|
530
530
|
```
|
|
531
531
|
|
|
532
|
-
>
|
|
532
|
+
> Note: Set a `timeout` in production. Without one, a stalled request can hang
|
|
533
533
|
> indefinitely. See [Handling Timeouts](#handling-timeouts) for the matching error handling.
|
|
534
534
|
|
|
535
|
-
>
|
|
535
|
+
> Note: `async/await` is part of ECMAScript 2017 and is not supported in Internet
|
|
536
536
|
> Explorer and older browsers, so use with caution.
|
|
537
537
|
|
|
538
538
|
Performing a `POST` request
|
|
@@ -617,13 +617,13 @@ For convenience, aliases have been provided for all common request methods.
|
|
|
617
617
|
|
|
618
618
|
##### axios.patch(url[, data[, config]])
|
|
619
619
|
|
|
620
|
-
######
|
|
620
|
+
###### Note
|
|
621
621
|
|
|
622
622
|
When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config.
|
|
623
623
|
|
|
624
|
-
### Concurrency (
|
|
624
|
+
### Concurrency (deprecated)
|
|
625
625
|
|
|
626
|
-
|
|
626
|
+
Use `Promise.all` instead of these helpers.
|
|
627
627
|
|
|
628
628
|
Helper functions for dealing with concurrent requests.
|
|
629
629
|
|
|
@@ -646,7 +646,7 @@ const instance = axios.create({
|
|
|
646
646
|
|
|
647
647
|
### Instance methods
|
|
648
648
|
|
|
649
|
-
The
|
|
649
|
+
The following instance methods are available. Axios merges the specified config with the instance config.
|
|
650
650
|
|
|
651
651
|
##### axios#request(config)
|
|
652
652
|
|
|
@@ -666,11 +666,11 @@ The available instance methods are listed below. The specified config will be me
|
|
|
666
666
|
|
|
667
667
|
##### axios#getUri([config])
|
|
668
668
|
|
|
669
|
-
## Request
|
|
669
|
+
## Request config
|
|
670
670
|
|
|
671
|
-
###
|
|
671
|
+
### Security notice: decompression-bomb protection is opt-in
|
|
672
672
|
|
|
673
|
-
By default `maxContentLength` and `maxBodyLength` are `-1` (unlimited). A malicious or compromised server can return a tiny gzip/deflate/brotli body that expands to gigabytes and exhaust the Node.js process.
|
|
673
|
+
By default `maxContentLength` and `maxBodyLength` are `-1` (unlimited). A malicious or compromised server can return a tiny gzip/deflate/brotli/zstd body that expands to gigabytes and exhaust the Node.js process.
|
|
674
674
|
|
|
675
675
|
If you call servers you do not fully trust, **set a cap**:
|
|
676
676
|
|
|
@@ -681,17 +681,17 @@ axios.defaults.maxBodyLength = 10 * 1024 * 1024;
|
|
|
681
681
|
|
|
682
682
|
See the [security guide](https://axios.rest/pages/misc/security.html) for details.
|
|
683
683
|
|
|
684
|
-
These are
|
|
684
|
+
These config options are available for requests. Only `url` is required. Requests default to `GET` when `method` is not set.
|
|
685
685
|
|
|
686
686
|
```js
|
|
687
687
|
{
|
|
688
|
-
// `url` is the server URL
|
|
688
|
+
// `url` is the server URL for the request
|
|
689
689
|
url: '/user',
|
|
690
690
|
|
|
691
691
|
// `method` is the request method to be used when making the request
|
|
692
692
|
method: 'get', // default
|
|
693
693
|
|
|
694
|
-
// `baseURL`
|
|
694
|
+
// Axios prepends `baseURL` to `url` unless `url` is absolute and `allowAbsoluteUrls` is set to true.
|
|
695
695
|
// It can be convenient to set `baseURL` for an instance of axios to pass relative URLs
|
|
696
696
|
// to the methods of that instance.
|
|
697
697
|
baseURL: 'https://some-domain.com/api/',
|
|
@@ -720,7 +720,7 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
720
720
|
return data;
|
|
721
721
|
}],
|
|
722
722
|
|
|
723
|
-
// `parseReviver` is an optional function
|
|
723
|
+
// `parseReviver` is an optional function passed as the
|
|
724
724
|
// second argument (reviver) to JSON.parse()
|
|
725
725
|
parseReviver: function (key, value, context) {
|
|
726
726
|
// In modern environments, context.source provides the raw JSON string
|
|
@@ -773,6 +773,7 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
773
773
|
// When no `transformRequest` is set, it must be of one of the following types:
|
|
774
774
|
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
|
|
775
775
|
// - Browser only: FormData, File, Blob
|
|
776
|
+
// - React Native: FormData
|
|
776
777
|
// - Node only: Stream, Buffer, FormData (form-data package)
|
|
777
778
|
data: {
|
|
778
779
|
firstName: 'Fred'
|
|
@@ -789,7 +790,7 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
789
790
|
data: 'Country=Brasil&City=Belo Horizonte',
|
|
790
791
|
|
|
791
792
|
// `timeout` specifies the number of milliseconds before the request times out.
|
|
792
|
-
// If the request takes longer than `timeout`,
|
|
793
|
+
// If the request takes longer than `timeout`, Axios aborts it.
|
|
793
794
|
timeout: 1000, // default is `0` (no timeout)
|
|
794
795
|
|
|
795
796
|
// `withCredentials` indicates whether or not cross-site Access-Control requests
|
|
@@ -810,6 +811,12 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
810
811
|
// `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
|
|
811
812
|
// This will set an `Authorization` header, overwriting any existing
|
|
812
813
|
// `Authorization` custom headers you have set using `headers`.
|
|
814
|
+
// If `auth` is omitted, the Node.js HTTP and fetch adapters can read
|
|
815
|
+
// HTTP Basic auth credentials from the request URL, for example
|
|
816
|
+
// `https://user:pass@example.com`. Axios decodes percent-encoded URL
|
|
817
|
+
// credentials, and `auth` takes precedence over URL-embedded credentials.
|
|
818
|
+
// The Node.js HTTP adapter preserves Basic auth on same-origin redirects
|
|
819
|
+
// and strips it on cross-origin redirects.
|
|
813
820
|
// Please note that only HTTP Basic auth is configurable through this parameter.
|
|
814
821
|
// For Bearer tokens and such, use `Authorization` custom headers instead.
|
|
815
822
|
auth: {
|
|
@@ -871,10 +878,12 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
871
878
|
// Do whatever you want with the Axios progress event
|
|
872
879
|
},
|
|
873
880
|
|
|
874
|
-
// `maxContentLength` defines the max size of the
|
|
881
|
+
// `maxContentLength` defines the max size of the response content in bytes.
|
|
882
|
+
// It is enforced by the Node.js HTTP adapter and the fetch adapter.
|
|
875
883
|
maxContentLength: 2000,
|
|
876
884
|
|
|
877
|
-
// `maxBodyLength`
|
|
885
|
+
// `maxBodyLength` defines the max size of the request content in bytes.
|
|
886
|
+
// It is enforced by the Node.js HTTP adapter and the fetch adapter when the body length can be determined.
|
|
878
887
|
maxBodyLength: 2000,
|
|
879
888
|
|
|
880
889
|
// `redact` masks matching config keys when AxiosError#toJSON() is called.
|
|
@@ -883,17 +892,22 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
883
892
|
|
|
884
893
|
// `validateStatus` defines whether to resolve or reject the promise for a given
|
|
885
894
|
// HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
|
|
886
|
-
// or `undefined`), the promise
|
|
887
|
-
// rejected.
|
|
895
|
+
// or `undefined`), Axios resolves the promise; otherwise, Axios rejects it.
|
|
888
896
|
validateStatus: function (status) {
|
|
889
897
|
return status >= 200 && status < 300; // default
|
|
890
898
|
},
|
|
891
899
|
|
|
892
900
|
// `maxRedirects` defines the maximum number of redirects to follow in node.js.
|
|
893
|
-
// If set to 0, no redirects
|
|
901
|
+
// If set to 0, Axios follows no redirects.
|
|
894
902
|
maxRedirects: 21, // default
|
|
895
903
|
|
|
896
|
-
// `
|
|
904
|
+
// `sensitiveHeaders` (Node only option) lists custom secret-bearing headers
|
|
905
|
+
// to remove from cross-origin redirects. Matching is case-insensitive.
|
|
906
|
+
// Same-origin redirects keep these headers. If `maxRedirects` is 0, this
|
|
907
|
+
// option is not used.
|
|
908
|
+
sensitiveHeaders: ['X-API-Key'],
|
|
909
|
+
|
|
910
|
+
// `beforeRedirect` defines a function that Axios calls before redirect.
|
|
897
911
|
// Use this to adjust the request options upon redirecting,
|
|
898
912
|
// to inspect the latest response headers,
|
|
899
913
|
// or to cancel the request by throwing an error
|
|
@@ -909,16 +923,10 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
909
923
|
},
|
|
910
924
|
// Security note:
|
|
911
925
|
// The `beforeRedirect` hook runs after sensitive headers are stripped during redirects.
|
|
912
|
-
//
|
|
913
|
-
//
|
|
914
|
-
//
|
|
915
|
-
|
|
916
|
-
// Security note:
|
|
917
|
-
// The beforeRedirect hook runs after sensitive headers are stripped during redirects.
|
|
918
|
-
// Re-injecting credentials without checking the destination can expose sensitive data.
|
|
919
|
-
// Only add credentials for trusted HTTPS destinations.
|
|
920
|
-
// Avoid re-adding credentials on downgraded redirects.
|
|
921
|
-
|
|
926
|
+
// `follow-redirects` removes credentials on protocol downgrades
|
|
927
|
+
// (HTTPS to HTTP). Because `beforeRedirect` runs after that step,
|
|
928
|
+
// re-injecting credentials without checking the destination can expose
|
|
929
|
+
// sensitive data. Only add credentials for trusted HTTPS destinations.
|
|
922
930
|
|
|
923
931
|
// `socketPath` defines a UNIX Socket to be used in node.js.
|
|
924
932
|
// e.g. '/var/run/docker.sock' to send requests to the docker daemon.
|
|
@@ -937,10 +945,10 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
937
945
|
// `ERR_BAD_OPTION_VALUE`. When null/undefined, no restriction is applied.
|
|
938
946
|
allowedSocketPaths: null, // default
|
|
939
947
|
|
|
940
|
-
// `transport` determines the transport method
|
|
941
|
-
// If defined,
|
|
942
|
-
// the default `http` or `https` library
|
|
943
|
-
// Otherwise, the `httpFollow` or `httpsFollow` library
|
|
948
|
+
// `transport` determines the transport method for the request.
|
|
949
|
+
// If defined, Axios uses it. Otherwise, if `maxRedirects` is 0,
|
|
950
|
+
// Axios uses the default `http` or `https` library, depending on the protocol specified in `protocol`.
|
|
951
|
+
// Otherwise, Axios uses the `httpFollow` or `httpsFollow` library, again depending on the protocol,
|
|
944
952
|
// which can handle redirects.
|
|
945
953
|
transport: undefined, // default
|
|
946
954
|
|
|
@@ -966,12 +974,15 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
966
974
|
// For `https://` targets, axios establishes a CONNECT tunnel through the
|
|
967
975
|
// proxy and performs TLS end-to-end with the origin; `Proxy-Authorization`
|
|
968
976
|
// is sent on the CONNECT request only, never on the wrapped TLS request,
|
|
969
|
-
// so the proxy never sees the URL, headers, or body.
|
|
970
|
-
// `httpsAgent`
|
|
977
|
+
// so the proxy never sees the URL, headers, or body. Axios forwards
|
|
978
|
+
// `httpsAgent` TLS options such as `ca`, `cert`, `key`, and
|
|
979
|
+
// `rejectUnauthorized` to the generated tunneling agent, so they still apply
|
|
980
|
+
// to the origin TLS connection.
|
|
981
|
+
// If you supply an `HttpsProxyAgent`, axios leaves tunneling to that agent.
|
|
971
982
|
// If the proxy server uses HTTPS, then you must set the protocol to `https`.
|
|
972
983
|
// A user-supplied `Host` header in `headers` is preserved when forwarding
|
|
973
984
|
// through a proxy (case-insensitive match on `host`/`Host`/`HOST`); this
|
|
974
|
-
// lets you target a virtual host that differs from the request URL
|
|
985
|
+
// lets you target a virtual host that differs from the request URL, for
|
|
975
986
|
// example, hitting `127.0.0.1:4000` while having the proxy treat the
|
|
976
987
|
// request as `example.com`. If no `Host` header is supplied, axios
|
|
977
988
|
// defaults it to the request URL's `hostname:port` as before. The Host
|
|
@@ -1000,6 +1011,8 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
1000
1011
|
// `decompress` indicates whether or not the response body should be decompressed
|
|
1001
1012
|
// automatically. If set to `true` will also remove the 'content-encoding' header
|
|
1002
1013
|
// from the responses objects of all decompressed responses
|
|
1014
|
+
// Axios supports gzip, deflate, brotli, and zstd when the current Node.js
|
|
1015
|
+
// runtime provides the corresponding zlib decompressor.
|
|
1003
1016
|
// - Node only (XHR cannot turn off decompression)
|
|
1004
1017
|
decompress: true, // default
|
|
1005
1018
|
|
|
@@ -1029,6 +1042,11 @@ These are the available config options for making requests. Only the `url` is re
|
|
|
1029
1042
|
// throw ETIMEDOUT error instead of generic ECONNABORTED on request timeouts
|
|
1030
1043
|
clarifyTimeoutError: false,
|
|
1031
1044
|
|
|
1045
|
+
// advertise `zstd` in the default Accept-Encoding header when the current
|
|
1046
|
+
// Node.js runtime supports zstd decompression. Axios still decompresses
|
|
1047
|
+
// zstd responses when support exists and `decompress` is true.
|
|
1048
|
+
advertiseZstdAcceptEncoding: false,
|
|
1049
|
+
|
|
1032
1050
|
// use the legacy interceptor request/response ordering
|
|
1033
1051
|
legacyInterceptorReqResOrdering: true, // default
|
|
1034
1052
|
},
|
|
@@ -1073,17 +1091,17 @@ const client = axios.create({
|
|
|
1073
1091
|
});
|
|
1074
1092
|
```
|
|
1075
1093
|
|
|
1076
|
-
##
|
|
1094
|
+
## HTTP/2 support
|
|
1077
1095
|
|
|
1078
|
-
Axios has experimental HTTP/2 support
|
|
1096
|
+
Axios has experimental HTTP/2 support in the Node.js HTTP adapter.
|
|
1079
1097
|
|
|
1080
|
-
Support depends on the runtime environment and Node.js version.
|
|
1098
|
+
Support depends on the runtime environment and Node.js version. Redirects and some adapter behavior may differ from HTTP/1.1.
|
|
1081
1099
|
|
|
1082
|
-
Options like `httpVersion` and `http2Options` are adapter-specific and may not work
|
|
1100
|
+
Options like `httpVersion` and `http2Options` are adapter-specific and may not work the same way in every environment.
|
|
1083
1101
|
|
|
1084
|
-
If HTTP/2
|
|
1102
|
+
If you need HTTP/2, check runtime support or use a custom adapter.
|
|
1085
1103
|
|
|
1086
|
-
## Response
|
|
1104
|
+
## Response schema
|
|
1087
1105
|
|
|
1088
1106
|
The response to a request contains the following information.
|
|
1089
1107
|
|
|
@@ -1113,7 +1131,7 @@ The response to a request contains the following information.
|
|
|
1113
1131
|
}
|
|
1114
1132
|
```
|
|
1115
1133
|
|
|
1116
|
-
When using `then`, you
|
|
1134
|
+
When using `then`, you receive the response like this:
|
|
1117
1135
|
|
|
1118
1136
|
```js
|
|
1119
1137
|
const response = await axios.get('/user/12345');
|
|
@@ -1124,18 +1142,18 @@ console.log(response.headers);
|
|
|
1124
1142
|
console.log(response.config);
|
|
1125
1143
|
```
|
|
1126
1144
|
|
|
1127
|
-
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
|
|
1145
|
+
When using `catch`, or passing a [rejection callback](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) as the second parameter of `then`, read the response from the `error` object. See [Handling errors](#handling-errors).
|
|
1128
1146
|
|
|
1129
|
-
## Config
|
|
1147
|
+
## Config defaults
|
|
1130
1148
|
|
|
1131
|
-
|
|
1149
|
+
Config defaults apply to every request.
|
|
1132
1150
|
|
|
1133
1151
|
### Global axios defaults
|
|
1134
1152
|
|
|
1135
1153
|
```js
|
|
1136
1154
|
axios.defaults.baseURL = 'https://api.example.com';
|
|
1137
1155
|
|
|
1138
|
-
// Important: If
|
|
1156
|
+
// Important: If you use axios with multiple domains, Axios sends AUTH_TOKEN to all of them.
|
|
1139
1157
|
// See below for an example using Custom instance defaults instead.
|
|
1140
1158
|
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
|
|
1141
1159
|
|
|
@@ -1156,7 +1174,7 @@ instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
|
|
|
1156
1174
|
|
|
1157
1175
|
### Config order of precedence
|
|
1158
1176
|
|
|
1159
|
-
|
|
1177
|
+
Axios merges config in this order: library defaults from [lib/defaults/index.js](https://github.com/axios/axios/blob/main/lib/defaults/index.js#L49), the instance `defaults` property, and the request `config` argument. Later values take precedence over earlier ones.
|
|
1160
1178
|
|
|
1161
1179
|
```js
|
|
1162
1180
|
// Create an instance using the config defaults provided by the library
|
|
@@ -1258,8 +1276,8 @@ axios.interceptors.request.use(
|
|
|
1258
1276
|
```
|
|
1259
1277
|
|
|
1260
1278
|
If you want to execute a particular interceptor based on a runtime check,
|
|
1261
|
-
you can add a `runWhen` function to the options object. The request interceptor will not
|
|
1262
|
-
of `runWhen` is `false`.
|
|
1279
|
+
you can add a `runWhen` function to the options object. The request interceptor will not run **if and only if** the return
|
|
1280
|
+
of `runWhen` is `false`. Axios calls the function with the config
|
|
1263
1281
|
object (don't forget that you can bind your own arguments to it as well.) This can be handy when you have an
|
|
1264
1282
|
asynchronous request interceptor that only needs to run at certain times.
|
|
1265
1283
|
|
|
@@ -1277,15 +1295,15 @@ axios.interceptors.request.use(
|
|
|
1277
1295
|
);
|
|
1278
1296
|
```
|
|
1279
1297
|
|
|
1280
|
-
>
|
|
1298
|
+
> Note: The options parameter (with `synchronous` and `runWhen` properties) is only supported for request interceptors at the moment.
|
|
1281
1299
|
|
|
1282
|
-
### Interceptor
|
|
1300
|
+
### Interceptor execution order
|
|
1283
1301
|
|
|
1284
|
-
|
|
1302
|
+
Request and response interceptors use different execution orders.
|
|
1285
1303
|
|
|
1286
|
-
Request interceptors
|
|
1304
|
+
Request interceptors run in reverse order (LIFO: last in, first out). The last interceptor added runs first.
|
|
1287
1305
|
|
|
1288
|
-
Response interceptors
|
|
1306
|
+
Response interceptors run in the order they were added (FIFO: first in, first out). The first interceptor added runs first.
|
|
1289
1307
|
|
|
1290
1308
|
Example:
|
|
1291
1309
|
|
|
@@ -1314,37 +1332,33 @@ instance.interceptors.response.use(interceptor('Response Interceptor 3'));
|
|
|
1314
1332
|
// Response Interceptor 3
|
|
1315
1333
|
```
|
|
1316
1334
|
|
|
1317
|
-
### Multiple
|
|
1335
|
+
### Multiple interceptors
|
|
1318
1336
|
|
|
1319
|
-
|
|
1320
|
-
and when the response was fulfilled
|
|
1337
|
+
When a response is fulfilled and multiple response interceptors are registered:
|
|
1321
1338
|
|
|
1322
|
-
-
|
|
1323
|
-
-
|
|
1324
|
-
-
|
|
1325
|
-
-
|
|
1326
|
-
-
|
|
1327
|
-
- then the following fulfillment-interceptor is not called
|
|
1328
|
-
- then the following rejection-interceptor is called
|
|
1329
|
-
- once caught, another following fulfill-interceptor is called again (just like in a promise chain).
|
|
1339
|
+
- Each interceptor runs in registration order.
|
|
1340
|
+
- Each interceptor receives the result from the previous interceptor.
|
|
1341
|
+
- The chain returns the result from the last interceptor.
|
|
1342
|
+
- If a fulfillment interceptor throws, Axios skips the next fulfillment interceptor and calls the next rejection interceptor.
|
|
1343
|
+
- After the error is caught, later fulfillment interceptors run again, just like in a promise chain.
|
|
1330
1344
|
|
|
1331
1345
|
Read [the interceptor tests](./test/specs/interceptors.spec.js) to see all this in code.
|
|
1332
1346
|
|
|
1333
|
-
## Error
|
|
1347
|
+
## Error types
|
|
1334
1348
|
|
|
1335
|
-
|
|
1349
|
+
Axios error messages include details that can help you debug the request.
|
|
1336
1350
|
|
|
1337
|
-
|
|
1351
|
+
Axios errors use this structure:
|
|
1338
1352
|
| Property | Definition |
|
|
1339
1353
|
| -------- | ---------- |
|
|
1340
1354
|
| message | A quick summary of the error message and the status it failed with. |
|
|
1341
1355
|
| name | This defines where the error originated from. For axios, it will always be an 'AxiosError'. |
|
|
1342
|
-
| stack |
|
|
1356
|
+
| stack | Stack trace for the error. |
|
|
1343
1357
|
| config | An axios config object with specific instance configurations defined by the user from when the request was made |
|
|
1344
|
-
| code |
|
|
1358
|
+
| code | Axios error code. The table below lists internal Axios error codes. |
|
|
1345
1359
|
| status | HTTP response status code. See [here](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) for common HTTP response status code meanings.
|
|
1346
1360
|
|
|
1347
|
-
|
|
1361
|
+
These are the internal Axios error codes:
|
|
1348
1362
|
|
|
1349
1363
|
| Code | Definition |
|
|
1350
1364
|
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -1354,16 +1368,16 @@ Below is a list of potential axios identified error:
|
|
|
1354
1368
|
| ERR_DEPRECATED | Deprecated feature or method used in axios. |
|
|
1355
1369
|
| ERR_INVALID_URL | Invalid URL provided for axios request. |
|
|
1356
1370
|
| ECONNABORTED | Typically indicates that the request has been timed out (unless `transitional.clarifyTimeoutError` is set) or aborted by the browser or its plugin. |
|
|
1357
|
-
| ERR_CANCELED |
|
|
1358
|
-
| ETIMEDOUT | Request timed out
|
|
1371
|
+
| ERR_CANCELED | The user explicitly canceled the request with an AbortSignal or CancelToken. |
|
|
1372
|
+
| ETIMEDOUT | Request timed out after exceeding the configured Axios timeout. Set `transitional.clarifyTimeoutError` to `true`; otherwise Axios throws a generic `ECONNABORTED` error. |
|
|
1359
1373
|
| ERR_NETWORK | Network-related issue. In the browser, this error can also be caused by a [CORS](https://developer.mozilla.org/ru/docs/Web/HTTP/Guides/CORS) or [Mixed Content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content) policy violation. The browser does not allow the JS code to clarify the real reason for the error caused by security issues, so please check the console. |
|
|
1360
|
-
| ERR_FR_TOO_MANY_REDIRECTS | Request
|
|
1374
|
+
| ERR_FR_TOO_MANY_REDIRECTS | Request exceeded the configured maximum number of redirects. |
|
|
1361
1375
|
| ERR_BAD_RESPONSE | Response cannot be parsed properly or is in an unexpected format. Usually related to a response with `5xx` status code. |
|
|
1362
1376
|
| ERR_BAD_REQUEST | The request has an unexpected format or is missing required parameters. Usually related to a response with `4xx` status code. |
|
|
1363
1377
|
|
|
1364
|
-
## Handling
|
|
1378
|
+
## Handling errors
|
|
1365
1379
|
|
|
1366
|
-
|
|
1380
|
+
By default, Axios rejects responses with status codes outside the 2xx range.
|
|
1367
1381
|
|
|
1368
1382
|
```js
|
|
1369
1383
|
axios.get('/user/12345').catch(function (error) {
|
|
@@ -1386,7 +1400,7 @@ axios.get('/user/12345').catch(function (error) {
|
|
|
1386
1400
|
});
|
|
1387
1401
|
```
|
|
1388
1402
|
|
|
1389
|
-
|
|
1403
|
+
Use `validateStatus` to override the default condition (`status >= 200 && status < 300`) and choose which HTTP status codes should reject.
|
|
1390
1404
|
|
|
1391
1405
|
```js
|
|
1392
1406
|
axios.get('/user/12345', {
|
|
@@ -1396,7 +1410,7 @@ axios.get('/user/12345', {
|
|
|
1396
1410
|
});
|
|
1397
1411
|
```
|
|
1398
1412
|
|
|
1399
|
-
|
|
1413
|
+
Use `toJSON` to get more information about the HTTP error.
|
|
1400
1414
|
|
|
1401
1415
|
```js
|
|
1402
1416
|
axios.get('/user/12345').catch(function (error) {
|
|
@@ -1415,7 +1429,7 @@ axios.get('/user/12345', {
|
|
|
1415
1429
|
});
|
|
1416
1430
|
```
|
|
1417
1431
|
|
|
1418
|
-
## Handling
|
|
1432
|
+
## Handling timeouts
|
|
1419
1433
|
|
|
1420
1434
|
```js
|
|
1421
1435
|
async function fetchWithTimeout() {
|
|
@@ -1449,7 +1463,7 @@ async function fetchWithTimeout() {
|
|
|
1449
1463
|
|
|
1450
1464
|
### AbortController
|
|
1451
1465
|
|
|
1452
|
-
|
|
1466
|
+
Since `v0.22.0`, Axios supports AbortController:
|
|
1453
1467
|
|
|
1454
1468
|
```js
|
|
1455
1469
|
const controller = new AbortController();
|
|
@@ -1465,15 +1479,15 @@ axios
|
|
|
1465
1479
|
controller.abort();
|
|
1466
1480
|
```
|
|
1467
1481
|
|
|
1468
|
-
### CancelToken
|
|
1482
|
+
### CancelToken (deprecated)
|
|
1469
1483
|
|
|
1470
1484
|
You can also cancel a request using a _CancelToken_.
|
|
1471
1485
|
|
|
1472
1486
|
> The axios cancel token API is based on the withdrawn [cancellable promises proposal](https://github.com/tc39/proposal-cancelable-promises).
|
|
1473
1487
|
|
|
1474
|
-
> This API is deprecated since v0.22.0 and
|
|
1488
|
+
> This API is deprecated since v0.22.0 and should not be used in new projects.
|
|
1475
1489
|
|
|
1476
|
-
|
|
1490
|
+
Create a cancel token with the `CancelToken.source` factory:
|
|
1477
1491
|
|
|
1478
1492
|
```js
|
|
1479
1493
|
const CancelToken = axios.CancelToken;
|
|
@@ -1505,7 +1519,7 @@ axios.post(
|
|
|
1505
1519
|
source.cancel('Operation canceled by the user.');
|
|
1506
1520
|
```
|
|
1507
1521
|
|
|
1508
|
-
You can also
|
|
1522
|
+
You can also pass an executor function to the `CancelToken` constructor:
|
|
1509
1523
|
|
|
1510
1524
|
```js
|
|
1511
1525
|
const CancelToken = axios.CancelToken;
|
|
@@ -1522,8 +1536,8 @@ axios.get('/user/12345', {
|
|
|
1522
1536
|
cancel();
|
|
1523
1537
|
```
|
|
1524
1538
|
|
|
1525
|
-
>
|
|
1526
|
-
> If a cancellation token is already cancelled
|
|
1539
|
+
> Note: You can cancel several requests with the same cancel token or abort controller.
|
|
1540
|
+
> If a cancellation token is already cancelled when an Axios request starts, Axios cancels the request immediately without making a real request.
|
|
1527
1541
|
|
|
1528
1542
|
> During the transition period, you can use both cancellation APIs, even for the same request:
|
|
1529
1543
|
|
|
@@ -1531,7 +1545,7 @@ cancel();
|
|
|
1531
1545
|
|
|
1532
1546
|
### URLSearchParams
|
|
1533
1547
|
|
|
1534
|
-
By default, axios serializes JavaScript objects to `JSON`. To send data
|
|
1548
|
+
By default, axios serializes JavaScript objects to `JSON`. To send data as [`application/x-www-form-urlencoded`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST), use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API. It works in most browsers and in [Node](https://nodejs.org/api/url.html#url_class_urlsearchparams) v10 and later.
|
|
1535
1549
|
|
|
1536
1550
|
```js
|
|
1537
1551
|
const params = new URLSearchParams({ foo: 'bar' });
|
|
@@ -1539,9 +1553,9 @@ params.append('extraparam', 'value');
|
|
|
1539
1553
|
axios.post('/foo', params);
|
|
1540
1554
|
```
|
|
1541
1555
|
|
|
1542
|
-
### Query string (
|
|
1556
|
+
### Query string (older browsers)
|
|
1543
1557
|
|
|
1544
|
-
For
|
|
1558
|
+
For very old browsers, use a [polyfill](https://github.com/WebReflection/url-search-params) and make sure it patches the global environment.
|
|
1545
1559
|
|
|
1546
1560
|
Alternatively, you can encode data using the [`qs`](https://github.com/ljharb/qs) library:
|
|
1547
1561
|
|
|
@@ -1550,7 +1564,7 @@ const qs = require('qs');
|
|
|
1550
1564
|
axios.post('/foo', qs.stringify({ bar: 123 }));
|
|
1551
1565
|
```
|
|
1552
1566
|
|
|
1553
|
-
|
|
1567
|
+
With ES modules:
|
|
1554
1568
|
|
|
1555
1569
|
```js
|
|
1556
1570
|
import qs from 'qs';
|
|
@@ -1566,7 +1580,7 @@ axios(options);
|
|
|
1566
1580
|
|
|
1567
1581
|
### Older Node.js versions
|
|
1568
1582
|
|
|
1569
|
-
For older Node.js engines,
|
|
1583
|
+
For older Node.js engines, use the [`querystring`](https://nodejs.org/api/querystring.html) module:
|
|
1570
1584
|
|
|
1571
1585
|
```js
|
|
1572
1586
|
const querystring = require('querystring');
|
|
@@ -1575,11 +1589,11 @@ axios.post('https://something.com/', querystring.stringify({ foo: 'bar' }));
|
|
|
1575
1589
|
|
|
1576
1590
|
You can also use the [`qs`](https://github.com/ljharb/qs) library.
|
|
1577
1591
|
|
|
1578
|
-
>
|
|
1592
|
+
> Note: The `qs` library is preferable if you need to stringify nested objects, as the `querystring` method has [known issues](https://github.com/nodejs/node-v0.x-archive/issues/1665) with that use case.
|
|
1579
1593
|
|
|
1580
|
-
###
|
|
1594
|
+
### Automatic serialization to URLSearchParams
|
|
1581
1595
|
|
|
1582
|
-
Axios
|
|
1596
|
+
Axios automatically serializes the data object to urlencoded format if the content-type header is set to "application/x-www-form-urlencoded".
|
|
1583
1597
|
|
|
1584
1598
|
```js
|
|
1585
1599
|
const data = {
|
|
@@ -1597,7 +1611,7 @@ await axios.postForm('https://postman-echo.com/post', data, {
|
|
|
1597
1611
|
});
|
|
1598
1612
|
```
|
|
1599
1613
|
|
|
1600
|
-
The server
|
|
1614
|
+
The server receives these fields:
|
|
1601
1615
|
|
|
1602
1616
|
```js
|
|
1603
1617
|
{
|
|
@@ -1614,7 +1628,7 @@ The server will handle it as:
|
|
|
1614
1628
|
}
|
|
1615
1629
|
```
|
|
1616
1630
|
|
|
1617
|
-
If your backend body
|
|
1631
|
+
If your backend body parser, such as `body-parser` for `express.js`, supports nested object decoding, the server receives the same object structure:
|
|
1618
1632
|
|
|
1619
1633
|
```js
|
|
1620
1634
|
const app = express();
|
|
@@ -1633,8 +1647,9 @@ server = app.listen(3000);
|
|
|
1633
1647
|
|
|
1634
1648
|
### FormData
|
|
1635
1649
|
|
|
1636
|
-
To send
|
|
1637
|
-
|
|
1650
|
+
To send data as `multipart/form-data`, pass a FormData instance as the payload.
|
|
1651
|
+
You do not need to set the `Content-Type` header. Axios detects it from the payload type.
|
|
1652
|
+
For browser, web worker, and React Native `FormData`, leave `Content-Type` unset so the runtime can add the multipart boundary.
|
|
1638
1653
|
|
|
1639
1654
|
```js
|
|
1640
1655
|
const formData = new FormData();
|
|
@@ -1643,7 +1658,7 @@ formData.append('foo', 'bar');
|
|
|
1643
1658
|
axios.post('https://httpbin.org/post', formData);
|
|
1644
1659
|
```
|
|
1645
1660
|
|
|
1646
|
-
In node.js,
|
|
1661
|
+
In node.js, use the [`form-data`](https://github.com/form-data/form-data) library:
|
|
1647
1662
|
|
|
1648
1663
|
```js
|
|
1649
1664
|
const FormData = require('form-data');
|
|
@@ -1658,12 +1673,12 @@ axios.post('https://example.com', form);
|
|
|
1658
1673
|
|
|
1659
1674
|
In node.js, when a `FormData` object provides `getHeaders()`, axios copies all returned headers by default for v1 compatibility. If the `FormData` object is custom or not fully trusted, set `formDataHeaderPolicy: 'content-only'` to copy only `Content-Type` and `Content-Length`, and set any other request headers explicitly with the request `headers` config.
|
|
1660
1675
|
|
|
1661
|
-
###
|
|
1676
|
+
### Automatic serialization to FormData
|
|
1662
1677
|
|
|
1663
|
-
|
|
1678
|
+
Since `v0.27.0`, Axios can serialize an object to FormData if the request `Content-Type`
|
|
1664
1679
|
header is set to `multipart/form-data`.
|
|
1665
1680
|
|
|
1666
|
-
|
|
1681
|
+
This request submits data as FormData in browsers and Node.js:
|
|
1667
1682
|
|
|
1668
1683
|
```js
|
|
1669
1684
|
import axios from 'axios';
|
|
@@ -1681,10 +1696,9 @@ axios
|
|
|
1681
1696
|
.then(({ data }) => console.log(data));
|
|
1682
1697
|
```
|
|
1683
1698
|
|
|
1684
|
-
|
|
1699
|
+
The Node.js build uses the [`form-data`](https://github.com/form-data/form-data) polyfill by default.
|
|
1685
1700
|
|
|
1686
|
-
You can
|
|
1687
|
-
but you probably won't need it in most cases:
|
|
1701
|
+
You can override the FormData class with the `env.FormData` config option, but most applications do not need this:
|
|
1688
1702
|
|
|
1689
1703
|
```js
|
|
1690
1704
|
const axios = require('axios');
|
|
@@ -1703,30 +1717,30 @@ axios
|
|
|
1703
1717
|
.then(({ data }) => console.log(data));
|
|
1704
1718
|
```
|
|
1705
1719
|
|
|
1706
|
-
Axios FormData serializer supports
|
|
1720
|
+
The Axios FormData serializer supports these special endings:
|
|
1707
1721
|
|
|
1708
1722
|
- `{}` - serialize the value with JSON.stringify
|
|
1709
1723
|
- `[]` - unwrap the array-like object as separate fields with the same key
|
|
1710
1724
|
|
|
1711
|
-
>
|
|
1725
|
+
> Note: Arrays and FileList objects are unwrapped by default.
|
|
1712
1726
|
|
|
1713
1727
|
FormData serializer supports additional options via `config.formSerializer: object` property to handle rare cases:
|
|
1714
1728
|
|
|
1715
|
-
- `visitor: Function` - user-defined visitor function that
|
|
1729
|
+
- `visitor: Function` - user-defined visitor function that Axios calls recursively to serialize the data object
|
|
1716
1730
|
to a `FormData` object by following custom rules.
|
|
1717
1731
|
|
|
1718
1732
|
- `dots: boolean = false` - use dot notation instead of brackets to serialize arrays and objects;
|
|
1719
1733
|
|
|
1720
1734
|
- `metaTokens: boolean = true` - add the special ending (e.g `user{}: '{"name": "John"}'`) in the FormData key.
|
|
1721
|
-
|
|
1735
|
+
A backend body parser can use this meta-information to parse the value as JSON.
|
|
1722
1736
|
|
|
1723
|
-
- `indexes: null|false|true = false` - controls how
|
|
1737
|
+
- `indexes: null|false|true = false` - controls how Axios adds indexes to unwrapped keys of `flat` array-like objects.
|
|
1724
1738
|
- `null` - don't add brackets (`arr: 1`, `arr: 2`, `arr: 3`)
|
|
1725
1739
|
- `false`(default) - add empty brackets (`arr[]: 1`, `arr[]: 2`, `arr[]: 3`)
|
|
1726
1740
|
- `true` - add brackets with indexes (`arr[0]: 1`, `arr[1]: 2`, `arr[2]: 3`)
|
|
1727
1741
|
- `maxDepth: number = 100` - maximum object nesting depth the serializer will recurse into. If the
|
|
1728
1742
|
input object exceeds this depth, an `AxiosError` with `code: 'ERR_FORM_DATA_DEPTH_EXCEEDED'` is
|
|
1729
|
-
thrown instead of overflowing the call stack. This protects server
|
|
1743
|
+
thrown instead of overflowing the call stack. This protects server applications from DoS
|
|
1730
1744
|
attacks via deeply nested payloads. Set to `Infinity` to disable the limit and restore pre-fix behaviour.
|
|
1731
1745
|
|
|
1732
1746
|
```js
|
|
@@ -1737,7 +1751,7 @@ axios.postForm('/api', data, { formSerializer: { maxDepth: 200 } });
|
|
|
1737
1751
|
axios.get('/api', { params: data, paramsSerializer: { maxDepth: 200 } });
|
|
1738
1752
|
```
|
|
1739
1753
|
|
|
1740
|
-
|
|
1754
|
+
Given this object:
|
|
1741
1755
|
|
|
1742
1756
|
```js
|
|
1743
1757
|
const obj = {
|
|
@@ -1752,7 +1766,7 @@ const obj = {
|
|
|
1752
1766
|
};
|
|
1753
1767
|
```
|
|
1754
1768
|
|
|
1755
|
-
The
|
|
1769
|
+
The Axios serializer appends these fields:
|
|
1756
1770
|
|
|
1757
1771
|
```js
|
|
1758
1772
|
const formData = new FormData();
|
|
@@ -1770,12 +1784,11 @@ formData.append('users[1][surname]', 'Anderson');
|
|
|
1770
1784
|
formData.append('obj2{}', '[{"x":1}]');
|
|
1771
1785
|
```
|
|
1772
1786
|
|
|
1773
|
-
Axios supports
|
|
1774
|
-
which are just the corresponding http methods with the `Content-Type` header preset to `multipart/form-data`.
|
|
1787
|
+
Axios supports `postForm`, `putForm`, and `patchForm` as shortcuts for the matching HTTP methods with the `Content-Type` header preset to `multipart/form-data`.
|
|
1775
1788
|
|
|
1776
|
-
##
|
|
1789
|
+
## Posting files
|
|
1777
1790
|
|
|
1778
|
-
|
|
1791
|
+
Submit a single file:
|
|
1779
1792
|
|
|
1780
1793
|
```js
|
|
1781
1794
|
await axios.postForm('https://httpbin.org/post', {
|
|
@@ -1798,9 +1811,9 @@ await axios.postForm('https://httpbin.org/post', {
|
|
|
1798
1811
|
await axios.postForm('https://httpbin.org/post', document.querySelector('#fileInput').files);
|
|
1799
1812
|
```
|
|
1800
1813
|
|
|
1801
|
-
|
|
1814
|
+
Axios sends all files with the same field name: `files[]`.
|
|
1802
1815
|
|
|
1803
|
-
##
|
|
1816
|
+
## HTML form posting (browser)
|
|
1804
1817
|
|
|
1805
1818
|
Pass an HTML Form element as a payload to submit it as `multipart/form-data` content.
|
|
1806
1819
|
|
|
@@ -1838,7 +1851,7 @@ For example, the Form
|
|
|
1838
1851
|
</form>
|
|
1839
1852
|
```
|
|
1840
1853
|
|
|
1841
|
-
|
|
1854
|
+
submits this JSON object:
|
|
1842
1855
|
|
|
1843
1856
|
```js
|
|
1844
1857
|
{
|
|
@@ -1860,10 +1873,10 @@ will be submitted as the following JSON object:
|
|
|
1860
1873
|
|
|
1861
1874
|
Sending `Blobs`/`Files` as JSON (`base64`) is not currently supported.
|
|
1862
1875
|
|
|
1863
|
-
##
|
|
1876
|
+
## Progress capturing
|
|
1864
1877
|
|
|
1865
|
-
Axios
|
|
1866
|
-
|
|
1878
|
+
Axios can capture request upload and download progress in browsers and Node.js.
|
|
1879
|
+
Progress events are limited to `3` times per second.
|
|
1867
1880
|
|
|
1868
1881
|
```js
|
|
1869
1882
|
await axios.post(url, data, {
|
|
@@ -1909,14 +1922,14 @@ const { data } = await axios.post(SERVER_URL, readableStream, {
|
|
|
1909
1922
|
});
|
|
1910
1923
|
```
|
|
1911
1924
|
|
|
1912
|
-
>
|
|
1925
|
+
> Note:
|
|
1913
1926
|
> Capturing FormData upload progress is not currently supported in node.js environments.
|
|
1914
1927
|
|
|
1915
|
-
>
|
|
1916
|
-
>
|
|
1917
|
-
>
|
|
1928
|
+
> Warning:
|
|
1929
|
+
> Set `maxRedirects: 0` when uploading streams in node.js.
|
|
1930
|
+
> The follow-redirects package buffers the entire stream in RAM and does not follow the "backpressure" algorithm.
|
|
1918
1931
|
|
|
1919
|
-
##
|
|
1932
|
+
## Rate limiting
|
|
1920
1933
|
|
|
1921
1934
|
Download and upload rate limits can only be set for the http adapter (node.js):
|
|
1922
1935
|
|
|
@@ -1930,25 +1943,24 @@ const { data } = await axios.post(LOCAL_SERVER_URL, myBuffer, {
|
|
|
1930
1943
|
});
|
|
1931
1944
|
```
|
|
1932
1945
|
|
|
1933
|
-
##
|
|
1946
|
+
## AxiosHeaders
|
|
1934
1947
|
|
|
1935
|
-
Axios
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
The old approach of directly manipulating the headers object is still available, but deprecated and not recommended for future usage.
|
|
1948
|
+
Axios includes an `AxiosHeaders` class for working with headers through a Map-like API.
|
|
1949
|
+
HTTP header names are case-insensitive, but Axios keeps the original header case for style and for servers that incorrectly depend on case.
|
|
1950
|
+
Directly manipulating the headers object still works, but it is deprecated.
|
|
1939
1951
|
|
|
1940
1952
|
### Working with headers
|
|
1941
1953
|
|
|
1942
|
-
An AxiosHeaders
|
|
1943
|
-
|
|
1954
|
+
An `AxiosHeaders` instance can contain several internal value types that control setting and merging.
|
|
1955
|
+
Axios gets the final headers object with string values by calling `toJSON`.
|
|
1944
1956
|
|
|
1945
1957
|
> Note: By JSON here we mean an object consisting only of string values intended to be sent over the network.
|
|
1946
1958
|
|
|
1947
1959
|
The header value can be one of the following types:
|
|
1948
1960
|
|
|
1949
|
-
- `string` - normal string value
|
|
1961
|
+
- `string` - normal string value sent to the server
|
|
1950
1962
|
- `null` - skip header when rendering to JSON
|
|
1951
|
-
- `false` - skip header when rendering to JSON
|
|
1963
|
+
- `false` - skip header when rendering to JSON. Also indicates that the `set` method must be called with `rewrite` set to `true`
|
|
1952
1964
|
to overwrite this value (Axios uses this internally to allow users to opt out of installing certain headers like `User-Agent` or `Content-Type`)
|
|
1953
1965
|
- `undefined` - value is not set
|
|
1954
1966
|
|
|
@@ -1965,7 +1977,7 @@ axios.interceptors.request.use((request: InternalAxiosRequestConfig) => {
|
|
|
1965
1977
|
'My-set-header2': 'my-set-value2',
|
|
1966
1978
|
});
|
|
1967
1979
|
|
|
1968
|
-
request.headers.set('User-Agent', false); //
|
|
1980
|
+
request.headers.set('User-Agent', false); // prevent Axios from setting this header later
|
|
1969
1981
|
|
|
1970
1982
|
request.headers.setContentType('text/plain');
|
|
1971
1983
|
|
|
@@ -2033,7 +2045,7 @@ Constructs a new `AxiosHeaders` instance.
|
|
|
2033
2045
|
constructor(headers?: RawAxiosHeaders | AxiosHeaders | string);
|
|
2034
2046
|
```
|
|
2035
2047
|
|
|
2036
|
-
If the headers object is a string,
|
|
2048
|
+
If the headers object is a string, Axios parses it as raw HTTP headers.
|
|
2037
2049
|
|
|
2038
2050
|
```js
|
|
2039
2051
|
const headers = new AxiosHeaders(`
|
|
@@ -2064,7 +2076,9 @@ The `rewrite` argument controls the overwriting behavior:
|
|
|
2064
2076
|
- `undefined` (default) - overwrite the header unless its value is set to `false`
|
|
2065
2077
|
- `true` - rewrite anyway
|
|
2066
2078
|
|
|
2067
|
-
The option can also accept a user-defined function that determines whether the value
|
|
2079
|
+
The option can also accept a user-defined function that determines whether to overwrite the value.
|
|
2080
|
+
|
|
2081
|
+
Empty or whitespace-only header names are ignored.
|
|
2068
2082
|
|
|
2069
2083
|
Returns `this`.
|
|
2070
2084
|
|
|
@@ -2128,7 +2142,7 @@ clear(matcher?: AxiosHeaderMatcher): boolean;
|
|
|
2128
2142
|
```
|
|
2129
2143
|
|
|
2130
2144
|
Removes all headers.
|
|
2131
|
-
Unlike the `delete` method matcher, this optional matcher
|
|
2145
|
+
Unlike the `delete` method matcher, this optional matcher matches the header name rather than the value.
|
|
2132
2146
|
|
|
2133
2147
|
```ts
|
|
2134
2148
|
const headers = new AxiosHeaders({
|
|
@@ -2172,17 +2186,18 @@ Returns `this`.
|
|
|
2172
2186
|
concat(...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>): AxiosHeaders;
|
|
2173
2187
|
```
|
|
2174
2188
|
|
|
2175
|
-
Merges the instance with targets into a new `AxiosHeaders` instance. If the target is a string,
|
|
2189
|
+
Merges the instance with targets into a new `AxiosHeaders` instance. If the target is a string, Axios parses it as raw HTTP headers.
|
|
2176
2190
|
|
|
2177
2191
|
Returns a new `AxiosHeaders` instance.
|
|
2178
2192
|
|
|
2179
2193
|
### AxiosHeaders#toJSON(asStrings?)
|
|
2180
2194
|
|
|
2181
2195
|
```
|
|
2182
|
-
toJSON(asStrings
|
|
2196
|
+
toJSON(asStrings: true): Record<string, string>;
|
|
2197
|
+
toJSON(asStrings?: false): Record<string, string | string[]>;
|
|
2183
2198
|
```
|
|
2184
2199
|
|
|
2185
|
-
|
|
2200
|
+
Resolves all internal header values into a new null prototype object.
|
|
2186
2201
|
Set `asStrings` to true to resolve arrays as a string containing all elements, separated by commas.
|
|
2187
2202
|
|
|
2188
2203
|
### AxiosHeaders.from(thing?)
|
|
@@ -2192,7 +2207,7 @@ from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders;
|
|
|
2192
2207
|
```
|
|
2193
2208
|
|
|
2194
2209
|
Returns a new `AxiosHeaders` instance created from the raw headers passed in,
|
|
2195
|
-
or
|
|
2210
|
+
or returns the given headers object if it's already an `AxiosHeaders` instance.
|
|
2196
2211
|
|
|
2197
2212
|
### AxiosHeaders.concat(...targets)
|
|
2198
2213
|
|
|
@@ -2216,11 +2231,10 @@ The following shortcuts are available:
|
|
|
2216
2231
|
|
|
2217
2232
|
- `setContentEncoding`, `getContentEncoding`, `hasContentEncoding`
|
|
2218
2233
|
|
|
2219
|
-
##
|
|
2234
|
+
## Fetch adapter
|
|
2220
2235
|
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
To use it by default, it must be selected explicitly:
|
|
2236
|
+
Axios introduced the fetch adapter in `v1.7.0`. By default, Axios uses it when the `xhr` and `http` adapters are not available in the build or not supported by the environment.
|
|
2237
|
+
To use it by default, select it explicitly:
|
|
2224
2238
|
|
|
2225
2239
|
```js
|
|
2226
2240
|
const { data } = axios.get(url, {
|
|
@@ -2238,20 +2252,21 @@ const fetchAxios = axios.create({
|
|
|
2238
2252
|
const { data } = fetchAxios.get(url);
|
|
2239
2253
|
```
|
|
2240
2254
|
|
|
2241
|
-
The adapter supports the same
|
|
2242
|
-
|
|
2255
|
+
The adapter supports the same features as the `xhr` adapter, including upload and download progress capturing.
|
|
2256
|
+
It also supports response types such as `stream` and `formdata` when the environment supports them.
|
|
2257
|
+
|
|
2258
|
+
When `auth` is omitted, the fetch adapter can read HTTP Basic auth credentials from the request URL, for example `https://user:pass@example.com`. Percent-encoded URL credentials are decoded before the `Authorization` header is generated, and `auth` takes precedence over URL-embedded credentials.
|
|
2243
2259
|
|
|
2244
|
-
###
|
|
2260
|
+
### Custom fetch
|
|
2245
2261
|
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
This
|
|
2262
|
+
Since `v1.12.0`, you can configure the fetch adapter to use a custom fetch API instead of environment globals.
|
|
2263
|
+
Pass a custom `fetch` function, `Request`, and `Response` constructors through `env` config.
|
|
2264
|
+
This helps in custom environments and app frameworks.
|
|
2249
2265
|
|
|
2250
|
-
|
|
2251
|
-
If your custom fetch
|
|
2252
|
-
you must disable their use inside the fetch adapter by passing null.
|
|
2266
|
+
When using a custom fetch, you may also need to set custom `Request` and `Response` constructors. If you do not set them, Axios uses the global objects.
|
|
2267
|
+
If your custom fetch API does not provide these objects and the globals are incompatible with it, pass `null` to disable them inside the fetch adapter.
|
|
2253
2268
|
|
|
2254
|
-
> Note: Setting `Request`
|
|
2269
|
+
> Note: Setting `Request` and `Response` to `null` prevents the fetch adapter from capturing upload and download progress.
|
|
2255
2270
|
|
|
2256
2271
|
Basic example:
|
|
2257
2272
|
|
|
@@ -2271,7 +2286,7 @@ const instance = axios.create({
|
|
|
2271
2286
|
});
|
|
2272
2287
|
```
|
|
2273
2288
|
|
|
2274
|
-
####
|
|
2289
|
+
#### Using with Tauri
|
|
2275
2290
|
|
|
2276
2291
|
A minimal example of setting up Axios for use in a [Tauri](https://tauri.app/plugin/http-client/) app with a platform fetch function that ignores CORS policy for requests.
|
|
2277
2292
|
|
|
@@ -2292,10 +2307,9 @@ const instance = axios.create({
|
|
|
2292
2307
|
const { data } = await instance.get('https://google.com');
|
|
2293
2308
|
```
|
|
2294
2309
|
|
|
2295
|
-
####
|
|
2310
|
+
#### Using with SvelteKit
|
|
2296
2311
|
|
|
2297
|
-
[SvelteKit](https://svelte.dev/docs/kit/web-standards#Fetch-APIs)
|
|
2298
|
-
which makes it incompatible with the standard URL API. So, Axios must be configured to use the custom fetch API:
|
|
2312
|
+
[SvelteKit](https://svelte.dev/docs/kit/web-standards#Fetch-APIs) uses a custom fetch function for server rendering in `load` functions. It also uses relative paths, which are incompatible with the standard URL API. Configure Axios to use SvelteKit's custom fetch API:
|
|
2299
2313
|
|
|
2300
2314
|
```js
|
|
2301
2315
|
export async function load({ fetch }) {
|
|
@@ -2312,13 +2326,13 @@ export async function load({ fetch }) {
|
|
|
2312
2326
|
}
|
|
2313
2327
|
```
|
|
2314
2328
|
|
|
2315
|
-
#### HTTP/2
|
|
2329
|
+
#### HTTP/2 support
|
|
2316
2330
|
|
|
2317
|
-
Axios supports HTTP/2
|
|
2331
|
+
Axios supports HTTP/2 through the Node.js `http` adapter, introduced in v1.13.0.
|
|
2318
2332
|
|
|
2319
|
-
|
|
2333
|
+
Support depends on the runtime environment. Axios relies on Node.js APIs, so HTTP/2 works in supported Node.js versions but may not work in other environments such as Bun or Deno.
|
|
2320
2334
|
|
|
2321
|
-
Options like `httpVersion` and `http2Options` are adapter-specific and may not behave
|
|
2335
|
+
Options like `httpVersion` and `http2Options` are adapter-specific and may not behave the same way in every environment.
|
|
2322
2336
|
|
|
2323
2337
|
Note: HTTP/2 redirects are currently not supported by the HTTP/2 adapter.
|
|
2324
2338
|
|
|
@@ -2340,7 +2354,7 @@ const { data, headers, status } = await axios.post('https://httpbin.org/post', f
|
|
|
2340
2354
|
|
|
2341
2355
|
## Semver
|
|
2342
2356
|
|
|
2343
|
-
|
|
2357
|
+
Axios follows [semver](https://semver.org/) since `v1.0.0`.
|
|
2344
2358
|
|
|
2345
2359
|
## Promises
|
|
2346
2360
|
|
|
@@ -2365,10 +2379,24 @@ try {
|
|
|
2365
2379
|
}
|
|
2366
2380
|
```
|
|
2367
2381
|
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2382
|
+
Use `axios.isCancel<T>()` to narrow cancellation errors to `CanceledError<T>`:
|
|
2383
|
+
|
|
2384
|
+
```typescript
|
|
2385
|
+
const controller = new AbortController();
|
|
2386
|
+
|
|
2387
|
+
try {
|
|
2388
|
+
await axios.get<User>('/user?ID=12345', { signal: controller.signal });
|
|
2389
|
+
} catch (error) {
|
|
2390
|
+
if (axios.isCancel<User>(error)) {
|
|
2391
|
+
handleCancellation(error);
|
|
2392
|
+
}
|
|
2393
|
+
}
|
|
2394
|
+
```
|
|
2395
|
+
|
|
2396
|
+
Because axios publishes an ESM default export and a CJS `module.exports`, TypeScript has a few caveats.
|
|
2397
|
+
The recommended setting is `"moduleResolution": "node16"`, which is implied by `"module": "node16"`. This requires TypeScript 4.7 or greater.
|
|
2398
|
+
If you use ESM, your settings should be fine.
|
|
2399
|
+
If you compile TypeScript to CJS and can't use `"moduleResolution": "node 16"`, enable `esModuleInterop`.
|
|
2372
2400
|
If you use TypeScript to type check CJS JavaScript code, your only option is to use `"moduleResolution": "node16"`.
|
|
2373
2401
|
|
|
2374
2402
|
You can also create a custom instance with typed interceptors:
|
|
@@ -2389,7 +2417,7 @@ apiClient.interceptors.request.use((config: InternalAxiosRequestConfig) => {
|
|
|
2389
2417
|
|
|
2390
2418
|
## Online one-click setup
|
|
2391
2419
|
|
|
2392
|
-
You can use Gitpod,
|
|
2420
|
+
You can use Gitpod, a free online IDE for open source projects, to contribute or run the examples online.
|
|
2393
2421
|
|
|
2394
2422
|
[](https://gitpod.io/#https://github.com/axios/axios/blob/main/examples/server.js)
|
|
2395
2423
|
|
|
@@ -2408,7 +2436,7 @@ npm rebuild husky && npx husky
|
|
|
2408
2436
|
|
|
2409
2437
|
Run those two commands once per fresh checkout. You do **not** need to re-run them after every subsequent `npm install`.
|
|
2410
2438
|
|
|
2411
|
-
Do not remove `ignore-scripts=true` from `.npmrc` to "fix" this
|
|
2439
|
+
Do not remove `ignore-scripts=true` from `.npmrc` to "fix" this. That reopens the lifecycle-script attack surface for every other package in the tree. All CI workflows already invoke npm with `--ignore-scripts`, so local behaviour matches CI.
|
|
2412
2440
|
|
|
2413
2441
|
## Resources
|
|
2414
2442
|
|
|
@@ -2419,7 +2447,7 @@ Do not remove `ignore-scripts=true` from `.npmrc` to "fix" this β that re-open
|
|
|
2419
2447
|
|
|
2420
2448
|
## Credits
|
|
2421
2449
|
|
|
2422
|
-
axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http)
|
|
2450
|
+
axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http) in [AngularJS](https://angularjs.org/). It provides a standalone `$http`-like service for use outside AngularJS.
|
|
2423
2451
|
|
|
2424
2452
|
## License
|
|
2425
2453
|
|