Node Hero: Частина 6 - Модуль запитів у Node.js

6 хв. читання

Що таке HTTP?

HTTP означає Hypertext Transfer Protocol. HTTP функціонує в якості протоколу запит-відповідь в обчислювальній клієнт-серверній моделі.

Коди стану HTTP

Перед тим, як зануритися в інші API, давайте розглянемо коди стану HTTP, з якими ми можемо зіткнутися в ході процесу розробки наших застосунків. Вони описують результати наших запитів і несуть важливе значення при обробці помилок.

  • 1xx - Інформаційні.

  • 2xx - Успішні операції: Ці коди стану вказують, що наш запит був отриманий і оброблений правильно. Найбільш поширеними кодами успішної операції є 200 OK, 201 Created і 204 No Content.

  • 3xx - Переадресація: Ця група показує, що клієнт повинен зробити додаткову дію для завершення запиту. Найбільш поширені коди переадресації: 301 Moved Permanently, 304 Not Modified.

  • 4xx - Клієнтська помилка: Цей клас кодів стану використовується, коли запит, надісланий клієнтом виявився несправним. Відповідь сервера зазвичай містить пояснення помилки. Найбільш поширені коди клієнтських помилок: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict.

  • 5xx - Серверна помилка: Ці коди надсилаються, коли сервер не в змозі виконати запит. Причиною може бути помилка в коді або тимчасова чи постійна недієздатність. Найбільш поширені такі коди: 500 Internal Server Error, 503 Service Unavailable. Якщо ви хочете дізнатися більше про коди стану HTTP, ви можете знайти деталі тут.

Надсилання запитів до зовнішніх API

Підключитися до зовнішніх API у Node дуже легко. Ви можете просто запросити основний модуль HTTP та почати відсилати запити.

Звичайно, є й ефективніші способи викликати зовнішню кінцеву точку. В NPM ви можете знайти кілька модулів, які можуть зробити цей процес простіше. Наприклад, два найбільш популярні з них є модулі request і superagent.

Обидва модулі мають інтерфейс типу error-first callback, який може привести до деяких проблем (я впевнений, ви чули про Callback-пекло), але, на щастя, у нас є доступ до версій загорнутих в promise.

Використання модуля запитів у Node.js

Використання модуля request-promise дуже просте. Після його встановлення з NPM, вам потрібно лише запросити його:

const request = require('request-promise')  

Відправлення GET-запиту так само просте:

const options = {  
  method: 'GET',
  uri: 'https://web.archive.org/web/20230327105409/https://risingstack.com'
}
​
request(options)  
  .then(function (response) {
    // Запит був успішним, використати об'єкт відповіді за власним бажанням
  })
  .catch(function (err) {
    // Щось пішло не так, обробити помилку
  })

Якщо ви викликаєте JSON API, ви можете захотіти, щоб request-promise автоматично аналізував відповідь. У цьому випадку, просто додайте це до параметрів запиту:

json: true  

​ POST-запити працюють таким самим чином:

const options = {  
  method: 'POST',
  uri: 'https://web.archive.org/web/20230327105409/https://risingstack.com/login',
  body: {
    foo: 'bar'
  },
  json: true 
    // JSON автоматично перетворює body на рядок
}
​
request(options)  
  .then(function (response) {
    // Обробити відповідь
  })
  .catch(function (err) {
    // Обробити помилку
  })

Щоб додати параметри рядка запиту потрібно просто додати властивість qs об'єкту options:

const options = {  
  method: 'GET',
  uri: 'https://web.archive.org/web/20230327105409/https://risingstack.com',
  qs: {
    limit: 10,
    skip: 20,
    sort: 'asc'
  }
}

Це створить ваш URL запиту:https://risingstack.com?limit=10&skip=20&sort=asc. Ви також можете оголосити заголовок таким самим чином:

const options = {  
  method: 'GET',
  uri: 'https://web.archive.org/web/20230327105409/https://risingstack.com',
  headers: {
    'User-Agent': 'Request-Promise',
    'Authorization': 'Basic QWxhZGRpbjpPcGVuU2VzYW1l'
  }
}

Обробка помилок

Обробка помилок є невід'ємною частиною у створенні запитів до зовнішніх API, так як ми ніколи не можемо бути впевнені, що з ними буде далі. Крім наших клієнтських помилок сервер може також відповісти помилкою або просто відправити дані в неправильному форматі. Пам'ятайте це, коли будете обробляти відповіді. Крім того, використовувати catch для кожного запиту є гарним способом уникнути збою нашого сервера через зовнішні сервери.

Збираємо все разом

Ви вже знаєте, як розкрутити HTTP-сервер в Node.js, як рендерити HTML-сторінки, і як отримувати дані з зовнішніх API, тому настав час зібрати їх!

У цьому прикладі ми створимо Express-застосування, яке може визначати поточні погодні умови на основі назв міст.

(Щоб отримати ключ AccuWeather​ API, перейдіть до їх сайту для розробників)

const express = require('express')  
const rp = require('request-promise')  
const exphbs = require('express-handlebars')

const app = express()

app.engine('.hbs', exphbs({  
  defaultLayout: 'main',
  extname: '.hbs',
  layoutsDir: path.join(__dirname, 'views/layouts')
}))
app.set('view engine', '.hbs')  
app.set('views', path.join(__dirname, 'views'))

app.get('/:city', (req, res) => {  
  rp({
    uri: 'https://web.archive.org/web/20230327105409/http://apidev.accuweather.com/locations/v1/search',
    qs: {
      q: req.params.city,
      apiKey: 'api-key'
         // Використайте ключ accuweather API тут
    },
    json: true
  })
    .then((data) => {
      res.render('index', data)
    })
    .catch((err) => {
      console.log(err)
      res.render('error')
    })
})

app.listen(3000)  

Наведений приклад робить наступне:

  • створює Express-сервер

  • встановлює handlebars структуру - щодо .hbs перейдіть до частини про HTTP-сервер у Node.js.

  • відправляє запит до зовнішнього API

    • якщо все добре, він рендерить сторінку
    • в іншому випадку, він показує сторінку помилки та реєструє цю помилку
Далі: Частина 7 - Структура проектів на Node.js
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 869
Приєднався: 1 рік тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід