# Quick Start Guide
## Getting and posting data with promises
The simplest `GET` request:
```js
import got from 'got';
const url = 'https://httpbin.org/anything';
const response = await got(url);
```
The call returns a Promise<[Response](3-streams.md#response-2)>. If the body contains JSON, it can be retrieved directly:
```js
import got from 'got';
const url = 'https://httpbin.org/anything';
const data = await got(url).json();
```
The similar [got.text](1-promise.md#promisetext) method returns plain text.
All `got` methods accept an options object for passing extra configuration, such as headers:
```js
import got from 'got';
const url = 'https://httpbin.org/anything';
const options = {
headers: {
'Custom-Header': 'Quick start',
},
timeout: {
send: 3500
},
};
const data = await got(url, options).json();
```
A `POST` request is very similar:
```js
import got from 'got';
const url = 'https://httpbin.org/anything';
const options = {
json: {
documentName: 'Quick Start',
},
};
const data = await got.post(url, options);
```
The request body is passed in the options object. The `json` property will automatically set headers accordingly. Custom headers can be added exactly as above.
## Using streams
The [Stream API](3-streams.md) allows to leverage [Node.js Streams](https://nodejs.dev/learn/nodejs-streams) capabilities:
```js
import fs from 'node:fs';
import {pipeline as streamPipeline} from 'node:stream/promises';
import got from 'got';
const url = 'https://httpbin.org/anything';
const options = {
json: {
documentName: 'Quick Start',
},
};
const gotStream = got.stream.post(url, options);
const outStream = fs.createWriteStream('anything.json');
try {
await streamPipeline(gotStream, outStream);
} catch (error) {
console.error(error);
}
```
## Options
Options can be set at the client level and reused in subsequent queries:
```js
import got from 'got';
const options = {
prefixUrl: 'https://httpbin.org',
headers: {
Authorization: getTokenFromVault(),
},
};
const client = got.extend(options);
export default client;
```
Some noticeable common options are:
- [`searchParams`](2-options.md#searchparams): A query string object.
- [`prefixUrl`](2-options.md#prefixurl): Prepended to query paths. Paths must be relative to prefix, i.e. not begin with a `/`.
- [`method`](2-options.md#method): The HTTP method name.
- [`headers`](2-options.md#headers): Query headers.
- [`json`](2-options.md#json): JSON body.
- [`form`](2-options.md#form): A form query string object.
See the documentation for other [options](2-options.md#options).
## Errors
Both Promise and Stream APIs throw errors with metadata.
```js
import got from 'got';
try {
const data = await got.get('https://httpbin.org/status/404');
} catch (error) {
console.error(error.response.statusCode);
}
```
```js
import got from 'got';
const stream = got.stream
.get('https://httpbin.org/status/404')
.once('error', error => {
console.error(error.response.statusCode);
});
```
## Miscellaneous
The HTTP method name can also be given as an option, this may be convenient when it is known only at runtime:
```js
import got from 'got';
const url = 'https://httpbin.org/anything';
const method = 'POST';
const options = {
method,
json: {
documentName: 'Quick Start',
},
};
const data = await got(url, options);
```
For most apps, HTTP clients just do `GET` and `POST` queries (`PUT`, `PATCH` or `DELETE` methods work similarly).
The following sections will give some pointers to more advanced usage.
### Timeouts
By default, requests have no timeout. It is a good practice to set one:
```js
import got from 'got';
const options = {
timeout: {
request: 10000,
},
};
const client = got.extend(options);
export default client;
```
The above sets a global timeout of 10000 milliseconds for all requests issued by the exported `client`. Like all options, timeouts can also be set at the request level. See the [`timeout` option](6-timeout.md#timeout-options).
### Retries
A failed request is retried twice. The retry policy may be tuned with a [`retry`](7-retry.md#retry) options object.
```js
import got from 'got';
const options = {
retry: {
limit: 5,
errorCodes: [
'ETIMEDOUT'
],
},
};
```
Retries with stream are a little trickier, see [`stream.on('retry', …)`](3-streams.md#streamonretry-).
### Hooks
Hooks are custom functions called on some request events:
```js
import got from 'got';
const logRetry = (error, retryCount) => {
console.error(`Retrying after error ${error.code}, retry #: ${retryCount}`);
};
const options = {
hooks: {
beforeRetry: [
logRetry,
],
},
};
const client = got.extend(options);
export default client;
```
*Note that hooks are given as arrays*, thus multiple hooks can be given. See documentation for other possible [hooks](9-hooks.md#hooks-api).
### Going further
There is a lot more to discover in the [documentation](../readme.md#documentation) and [tips](tips.md#tips). Among others, `Got` can handle [cookies](tips.md#cookies), [pagination](4-pagination.md#pagination-api), [cache](cache.md#cache). Please read the documentation before implementing something that is already done by `Got` :innocent:.