Перейти к содержанию

Отправка HTTP-запросов

Для осуществления HTTP-запросов к стороннему API в Node js приложении, работающим в связке с Express, используется устанавливаемый npm модуль request.

npm install request --save

Модуль request для разных типов HTTP методов реализовывает одноименные функции:

  • get;
  • post;
  • put;
  • delete.

Пример GET-запроса.

app.js

const express = require('express'),
  app = express(),
  request = require('request')

const host = '127.0.0.1'
const port = 7000

app.get('/', (req, res) => {
  request('http://example.com/api', (err, response, body) => {
    if (err) return res.status(500).send({ message: err })

    return res.send(body)
  })
})

app.listen(port, host, () => console.log(`Server listens http://${host}:${port}`))

Метод get() принимает аргументами URL, к которому необходимо выполнить запрос, и callback-функцию.

Callback-функция принимает три параметра:

  • ошибку;
  • объект ответа;
  • отправленные в качестве ответа данные.

Пример POST-запроса.

post.js

request.post(
  {
    url: 'http://example.com/api',
    form: {
      login: 'login1',
      password: 'password1'
    }
  },
  (err, response, body) => {
    if (err) return res.status(500).send({ message: err })

    return res.send(body)
  }
)

Для отправки методом post() данных в качестве первого аргумента передается объект со свойствами url и form, в которых задается URL, к которому необходимо выполнить запрос, и сами данные, которые задаются в качестве значения свойству body, соответственно. Вторым параметром передается callback-функция.

Если необходимо передать в запросе файлы, то данные необходимо преобразовать в объект formData, которые при отправке указываются в одноименном свойстве.

post-form-data.js

request.post(
  {
    url: 'http://example.com/api',
    formData: {
      profile_image: fs.createReadStream('/static/images/user.png'),
      //детальная конфигурация
      profile_image2: {
        value: fs.createReadStream('/static/images/user.png'),
        options: {
          filename: 'my-photo.png',
          contentType: 'image/png'
        }
      },
      //передача множества файлов
      attachments: [fs.createReadStream('/static/images/user1.png'), fs.createReadStream('/static/images/user2.png')]
    }
  },
  (err, response, body) => {
    if (err) return res.status(500).send({ message: err })

    return res.send(body)
  }
)

Для задания в Node.js request HTTP-заголовков первым аргументом вместо строки, задающей URL, передайте объект в следующем формате.

post-headers.js

request.post(
  {
    url: 'http://example.com/api',
    headers: { 'X-Custom-Header': 1 }
  },
  (err, response, body) => {
    if (err) return res.status(500).send({ message: err })

    return res.send(body)
  }
)

Пример выполнения DELETE-запроса.

delete.js

request(
  {
    method: 'DELETE',
    url: 'http://example.com/api'
  },
  (err, response, body) => {
    if (err) return res.status(500).send({ message: err })

    return res.send(body)
  }
)

Если вам удобнее работать с объектами Promise или вы хотите использовать конструкцию async/await, тогда в таком случае лучше использовать модуль request-promise.