В этом блоге мы узнаем, как интегрировать два API в один проект и заставить их общаться друг с другом. Мы создадим приложение Node.js, которое будет использовать API геолокации IP и API погоды. Я считаю, что многие разработчики создали погодное приложение в качестве одного из своих учебных проектов. Сегодня мы можем немного продвинуться вперед и добавить еще один API, чтобы сделать погодное приложение умнее.

В типичном погодном приложении вам нужно будет ввести свое местоположение, но в нашем проекте мы узнаем текущее местоположение с помощью API геолокации IP.

Ниже у нас есть базовая структура нашего приложения. Мы видим, что есть три важных шага:

  1. Получение IP-адреса устройства
  2. Вызов API геолокации IP с IP-адресом в качестве параметра и сохранение возвращенного объекта
  3. Вызов API погоды со штатом и городом в качестве параметров и вывод результата пользователю


Настройка сервера

Мы собираемся использовать Node.js и Express для создания нашего приложения.

mkdir geo-wea
cd geo-wea
npm init -y
npm i express
Войти в полноэкранный режим

Выйти из полноэкранного режима

Мы будем использовать современные модули ES. Чтобы Node.js правильно обрабатывал их, перейдите к package.json файл и добавить "type": "module". Результат должен выглядеть примерно так:

{
  "name": "geo-wea",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.1"
  }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Создавать index.js файл со следующим кодом:

import express from 'express';

const app = express();
app.listen(3000, () => {
  console.log('Server listening on 3000');
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь, чтобы проверить, все ли работает, запустите приложение:

node index.js
Войти в полноэкранный режим

Выйти из полноэкранного режима


Извлечение IP-адреса устройства

Каждый запрос, который устройство отправляет на сервер, всегда будет иметь IP-адрес устройства.

Теперь нам нужно прочитать IP-адрес устройства, подключающегося к нашему приложению. Express может прочитать его из входящего соединения. Как правило, наше приложение будет работать за обратным прокси-сервером, который будет передавать исходный IP-адрес в заголовках HTTP. Express не будет читать этот заголовок по умолчанию, но вы можете указать ему доверять IP-адресу, переданному в заголовках от прокси:

app.set('trust proxy', true);
Войти в полноэкранный режим

Выйти из полноэкранного режима

Чтобы узнать больше, проверьте Публичный и частный IP-адрес: в чем разница.

Мы можем прочитать IP-адрес из ip свойство входящего запроса (req). Заменять index.js со следующим кодом:

import express from 'express';
const app = express();
app.set('trust proxy', true);

app.get('/', async (req, res) => {
  const ip = req.ip;
  res.send(ip);
});

app.listen(3000, () => {
  console.log('Server listening on 3000');
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь, когда вы посещаете свое приложение, работающее локально или в CodeSandbox, вы должны увидеть свой IP-адрес.

Примечание: Я использую CodeSandbox для этого примера, потому что, если я запущу сервер на своем ПК, он увидит, что я подключаюсь из localhost или локальный IP-адрес.


Установка Superface SDK

я собираюсь использовать Суперфейс для интеграции API, поскольку это делает интеграцию очень простой. Поскольку в этом проекте мы будем использовать два API, обычно мне пришлось бы просматривать два разных документа по API, но с могущественной мощью Superface мне это не нужно. Учитесь одному, чтобы победить всех.

Сначала установите Superface OneSDK в свое приложение:

npm i @superfaceai/one-sdk
Войти в полноэкранный режим

Выйти из полноэкранного режима

Мы возьмем следующие варианты использования из Каталог Суперфейс: Поиск IP-геолокации а также Текущая погода в городе.


API геолокации IP

Это позволяет нам идентифицировать страну, штат и город на основе IP-адреса вашего устройства. Чтобы узнать больше об IP-геолокации, ознакомьтесь с моей предыдущей статьей.

Теперь нам нужно выбрать поставщика для использования. Я буду использовать ipdata. Создайте учетную запись на ipdata.co чтобы получить ключ API.

Вернуться в СуперфейсВыбрать ipdata провайдера, скопируйте и вставьте код из примера в свой index.js файл. Заменять <your apikey from ipdata> с ключом API, который вы получили от ipdata, и общедоступным IP-адресом, который вы вошли в ipAddress имущество.

Вот полученный код:

import express from 'express';
import { SuperfaceClient } from '@superfaceai/one-sdk';

const app = express();
app.set('trust proxy', true);

const sdk = new SuperfaceClient();

async function run(ip) {
  // Load the profile
  const profile = await sdk.getProfile('address/ip-geolocation@1.0.1');

  // Use the profile
  const result = await profile.getUseCase('IpGeolocation').perform(
    {
      ipAddress: ip,
    },
    {
      provider: 'ipdata',
      security: {
        apikey: {
          apikey: '<your apikey from ipdata>',
        },
      },
    }
  );

  // Handle the result
  try {
    const data = result.unwrap();
    return data;
  } catch (error) {
    console.error(error);
  }
}

app.get('/', async (req, res) => {
  res.send(await run(req.ip));
});

app.listen(3000, () => {
  console.log('SERVER RUNNING AT PORT 3000');
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь просто запустите свое приложение с помощью node index.jsпосещать localhost:3000и вы должны увидеть результат:


API погоды

Переходим к третьему шагу: вызов API погоды с данными, возвращаемыми API геолокации IP. Этот API вернет нам текущую погоду в городе, который мы предоставляем. Находить Получить текущую погоду в городе в каталоге Superface и выберите провайдера. Для этого урока я буду использовать openweathermap.

Завести аккаунт на OpenWeatherMap.

Как и раньше, скопируйте и вставьте код из примера. Заменять <your apikey from openweathermap> с ключом API, который вы получили от OpenWeatherMap, и передайте город, который вы получили от вызова API геокодирования. Переименовать run функцию, к чему-то более описательному. Вот полученный код:

import express from 'express';
import { SuperfaceClient } from '@superfaceai/one-sdk';

const app = express();
app.set('trust proxy', true);

const sdk = new SuperfaceClient();

async function findCity(ip) {
  // Load the profile
  const profile = await sdk.getProfile('address/ip-geolocation@1.0.1');

  // Use the profile
  const result = await profile.getUseCase('IpGeolocation').perform(
    {
      ipAddress: ip,
    },
    {
      provider: 'ipdata',
      security: {
        apikey: {
          apikey: '9a511b6fc8334e1852cfbbd4ff3f1af3c42ed6abc75e96a1648b969a',
        },
      },
    }
  );

  // Handle the result
  try {
    const data = result.unwrap();
    return data;
  } catch (error) {
    console.error(error);
  }
}

async function weather(city) {
  // Load the profile
  const profile = await sdk.getProfile('weather/current-city@1.0.3');

  // Use the profile
  const result = await profile.getUseCase('GetCurrentWeatherInCity').perform(
    {
      city: city,
      units: 'C',
    },
    {
      provider: 'openweathermap',
      security: {
        apikey: {
          apikey: '9a7c7994ccda87a3f8bb2767d5ca48db',
        },
      },
    }
  );

  // Handle the result
  try {
    const data = result.unwrap();
    return data;
  } catch (error) {
    console.error(error);
  }
}

app.get('/', async (req, res) => {
  try {
    let city = await findCity(req.ip);
    res.send(await weather(city.addressLocality));
  } catch (error) {
    console.log(error);
  }
});

app.listen(3000, () => {
  console.log('SERVER RUNNING AT PORT 3000');
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь запустите ваше приложение с помощью node index.js вы должны увидеть результат:

Вы можете найти окончательный результат на CodeSandbox.