# send-request

> Lightweight HTTP client for Node.

Latest version **1.0.5** (published 2019-10-24) · MIT license · 0 weekly downloads

## Install

```sh
npm install send-request
pnpm add send-request
yarn add send-request
bun add send-request
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.5 |
| Published | 2019-10-24 |
| First published | 2018-11-27 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=10.0.0 |
| Dependencies | 3 |
| Unpacked size | 14.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Risan Bagja Pradana |
| Maintainers | risan |
| Keywords | http, https, http-client |

## Links

- npm: https://www.npmjs.com/package/send-request
- Repository: https://github.com/risan/send-request
- Homepage: https://github.com/risan/send-request#readme
- Issues: https://github.com/risan/send-request/issues
- npm.io page: https://npm.io/package/send-request

## Dependencies (3)

- [str-to-stream](https://npm.io/package/str-to-stream.md) 1.x
- [@risan/is-empty](https://npm.io/package/@risan/is-empty.md) ^1.0.0
- [@risan/is-plain-obj](https://npm.io/package/@risan/is-plain-obj.md) ^1.0.4

## Recent versions

- 1.0.5 (latest) — 2019-10-24
- 1.0.4 — 2019-10-22
- 1.0.3 — 2018-12-07
- 1.0.2 — 2018-12-02
- 1.0.1 — 2018-11-29
- 1.0.0 — 2018-11-27

## README

# Send Request

[![Build Status](https://badgen.net/travis/risan/send-request)](https://travis-ci.org/risan/send-request)
[![Test Covarage](https://badgen.net/codecov/c/github/risan/send-request)](https://codecov.io/gh/risan/send-request)
[![Latest Version](https://badgen.net/npm/v/send-request)](https://www.npmjs.com/package/send-request)

Lightweight HTTP client for Node.

## Installation

```bash
$ npm install send-request
```

## Usage

Send HTTP GET request:

```js
const sendRequest = require("send-request");

(async () => {
  const response = await sendRequest("https://httpbin.org/json");

  console.log(`Status Code: ${response.statusCode}`);
  console.log({ headers: response.headers });
  console.log(response.body); // Response as a string

  // If response's content type is a JSON, you get the parsed object.
  console.log(response.json);
})();
```

## Recipes

### Handling Error

```js
const sendRequest = require("send-request");

(async () => {
  try {
    const response = await sendRequest("https://httpbin.org/status/400");
  } catch(error) {
    console.log(error.message);

    // If it's an HTTP error, it will have response property.
    if (error.response) {
      console.log(error.response.statusCode); // 400
      console.log(error.response.statusMessage);
      console.log(error.response.headers);
      console.log(error.response.body);
    }
  }
})();
```

### Send HTTP POST Request with Body

If you don't set the `content-type` and `content-length` headers, it will be automatically added. The `content-type` will be set to `application/x-www-form-urlencoded`.

```js
const sendRequest = require("send-request");

(async () => {
  const response = await sendRequest("https://httpbin.org/anything", {
    method: "POST",
    body: {
      foo: "bar"
    }
  });

  console.log(response.body);
})();
```

### Send HTTP Request with JSON Body

If you don't set the `content-type` and `content-length` headers, it will be automatically added. The `content-type` will be set to `application/json`.

```js
const sendRequest = require("send-request");

(async () => {
  const response = await sendRequest("https://httpbin.org/anything", {
    method: "POST",
    body: {
      foo: "bar"
    },
    json: true // Must be set to true
  });

  console.log(response.json);
})();
```

### Sending File with FormData

You pass the [`FormData`](https://github.com/form-data/form-data) instance as a `body`. If you don't set the `content-type` and `content-length` headers, it will be automatically added. The `content-type` will be set to `multipart/form-data`. The `json` option won't have any effect.

```js
const fs = require("fs");
const sendRequest = require("send-request");
const FormData = require("form-data");

(async () => {
  const file = fs.createReadStream("./test.txt");

  const form = new FormData();
  form.append("foo", "bar");
  form.append("my_file", file);

  const response = await sendRequest("https://httpbin.org/anything", {
    method: "POST",
    body: form
  });

  console.log(response);
})();
```

## API

```js
sendRequest(url, [{
  method,
  headers,
  auth: {
    username,
    password
  },
  body,
  json,
  encoding
}])
```

### Parameters

* **`url`** (*`String`*): The URL to send the HTTP request to.
* **`method`** (optional *`String`*): The HTTP method to use, default to `GET`.
* **`headers`** (optional *`Object`*): The request headers to send.
* **`auth.username`** (optional *`String`*): The username for HTTP basic auth.
* **`auth.password`** (optional *`String`*): The password for HTTP basic auth.
* **`body`** (optional *`Object|FormData`*): The request body to send. It can be a plain JavaScript object or an instance of [`FormData`](https://github.com/form-data/form-data).
* **`json`** (optional *Boolean*): Set to `true` if you want to send the request body with `application/json` content type. Default to `false`, which means that the request body will be sent as `application/x-www-form-urlencoded`. Note that you can still override the content type using the `headers` option.
* **`encoding`** (optional *`String`*|*`Null`*): The encoding to decode the incoming response. If set to `null`, the response's body will be a `Buffer` instance.

### Returns

It returns a `Promise` which when resolved contains a response object. Here's an example of a reponse object:

```js
{
  statusCode: 200,
  statusMessage: "OK",
  headers: {
    "content-type": "application/json"
  },
  body: '{"foo": "bar"}',
  json: {
    foo: "bar"
  }
}
```

* **`statusCode`** (*Number*): The HTTP status code.
* **`statusMessage`** (*Number*): The HTTP status message (reason phrase).
* **`headers`** (*Object*): The response's headers.
* **`body`** (*String*): The response's body.
* **`json`** (*Object*): The parsed JSON body. It only exist if the response's content type is `application/json`.

## License

[MIT](https://github.com/risan/send-request/blob/master/LICENSE) © [Risan Bagja Pradana](https://risanb.com)

---
_Source: https://npm.io/package/send-request · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
