Како користити вдзвдз АПИ за ДНС тражење у ЈаваСцрипт-у (НодеЈС)

Kako koristiti vdzvdz API u NodeJS-u za DNS upite

U ovom uputstvu demonstriraćemo kako se koristi vdzvdz API u NodeJS okruženju za proveru DNS zapisa bilo koje domene. Kreiraćemo jednostavan skript koji, kada se pokrene, ispisuje IP adrese Google-ovih servera.

Ovaj skript koristiće vdzvdz DNS Lookup API. Za njegovu izradu koristićemo tri različita pristupa. Prvi pristup uključuje ugrađeni `https` modul u NodeJS-u. Drugi pristup koristiće `node-fetch` modul. Treći pristup će koristiti `axios` klijentsku biblioteku.

Šta je vdzvdz API?

vdzvdz API nudi set REST API-ja za testiranje performansi veb sajtova, DNS-a i bezbednosnih metrika. Možete obavljati razne zadatke, kao što su snimanje ekrana, generisanje PDF dokumenata, struganje veba, skeniranje portova i mnogo više.

Preduslovi

Za praćenje ovog uputstva potrebno je razumevanje JavaScript-a, uključujući promise (obećanja) i ES6 sintaksu. Što se tiče softvera, neophodno je da imate instaliran NodeJS i tekst editor, poput Visual Studio Code-a.

Biće vam potreban vdzvdz nalog kako biste dobili API ključ koji je potreban za autentifikaciju prilikom slanja zahteva. Da biste ga dobili, posetite odredišnu stranicu API-ja i kreirajte besplatan nalog.

Nakon kreiranja naloga, bićete preusmereni na kontrolnu tablu gde ćete pronaći svoj API ključ.

Izgradnja projekta

Za početak, kreirajte fasciklu projekta i otvorite je koristeći terminal po vašem izboru, a zatim pokrenite sledeću naredbu:

npm init -y

Gornja komanda će inicijalizovati direktorijum projekta kao NodeJS projekat.

Zatim pokrenite sledeću naredbu, koja će instalirati sve neophodne zavisnosti za naš projekat:

npm install dotenv axios node-fetch

Nakon što su zavisnosti uspešno instalirane, kreirajte tri skripta u osnovnoj fascikli projekta. Nazovite ih `vanilla.js`, `with-axios.js`, i `with-fetch.js`. Takođe, kreirajte `.env` datoteku za čuvanje naših promenljivih okruženja.

Na kraju, struktura projekta trebalo bi da izgleda ovako:

Zatim, otvorite `.env` datoteku i dodajte svoj vdzvdz API ključ, koristeći sledeći red koda:

API_KEY=<api key>

Zamenite `` svojim stvarnim API ključem.

vanilla.js

NodeJS ima ugrađene `http` i `https` module koje možemo koristiti za slanje klijentskih zahteva. Prvo ćemo iskoristiti ovaj pristup.

Otvorite datoteku `vanilla.js` i dodajte sledeće linije koda na sam vrh kako biste uvezli potrebne zavisnosti:

import { request } from "https";
import { config } from "dotenv";

Zatim ćemo pozvati funkciju `config()` za učitavanje promenljivih okruženja. Nakon toga ćemo sačuvati API ključ i ime hosta u odgovarajuće promenljive.

config();

const apiKey = process.env.API_KEY;
const host="google.com";

Kada pozovemo funkciju `request` da bismo pokrenuli HTTP zahtev u NodeJS-u, moraćemo da obezbedimo opcije koje se odnose na host i krajnju tačku na koju želimo da se povežemo, HTTP metod koji ćemo koristiti i zaglavlja za zahtev. Dakle, sledeće ćemo kreirati promenljivu koja će čuvati ove opcije.

const options = {
  hostname: "api.techblog.co.rs.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

Do sada, kod u datoteci `vanilla.js` izgleda ovako:

import { request } from "https";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host="google.com"

const options = {
  hostname: "api.techblog.co.rs.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

Sada možemo nastaviti pozivanjem funkcije `request`, prosleđujući joj objekat `options`:

const req = request(options, response => {

  // ovde ćemo dodati rukovaoce odgovorima

});

Kao što vidite, funkcija `request` prima dva argumenta. Prvi je objekat opcija koji smo definisali ranije. Drugi je callback funkcija koja će upravljati odgovorom sa servera. Unutar callback funkcije, možemo dodati osluškivače (event listeners) kada server pošalje podatke, završi slanje podataka, ili pošalje grešku.

Da bismo dodali različite rukovaoce odgovorima, dodajte sledeće linije koda unutar callback funkcije:

let data = "";

response.on("data", chunk => {
  data += chunk;
});

response.on("end", () => {
  console.log(JSON.parse(data).data.A);
});

response.on("error", error => {
  console.log(error);
});

Promenljiva `data` je jednostavno string u koji ćemo čuvati serverov JSON odgovor dok nam se šalje. Da bismo zaista sačuvali podatke, osluškivaćemo `data` događaje objekta odgovora. Kad god se ovaj događaj pokrene, dodaćemo deo podataka koji server šalje promenljivoj `data`.

Zatim, da bismo konačno koristili podatke, osluškivaćemo `end` događaj na objektu odgovora. Ovaj događaj će biti pozvan kada svi podaci budu poslati sa servera i kada završi svoj odgovor. Na kraju, osluškivaćemo greške i prijaviti ih na konzolu ukoliko se pojave.

Zbog toga bi poziv funkcije `request` trebao da izgleda ovako:

const req = request(options, response => {

  let data = "";

  response.on("data", chunk => {
    data += chunk;
  });

  response.on("end", () => {
    console.log(JSON.parse(data).data.A);
  });

  response.on("error", error => {
    console.log(error);
  });

});

Na kraju, moramo da upišemo neke podatke u telo zahteva i da završimo zahtev.

req.write(JSON.stringify({ url: host, types: ["A"] }));
req.end();

Konačno, datoteka bi trebalo da izgleda ovako:

import { request } from "https";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host="google.com"

const options = {
  hostname: "api.techblog.co.rs.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

const req = request(options, response => {

  let data = "";

  response.on("data", chunk => {
    data += chunk;
  });

  response.on("end", () => {
    console.log(JSON.parse(data).data.A);
  });

  response.on("error", error => {
    console.log(error);
  });

});

req.write(JSON.stringify({ url: host, types: ["A"] }));
req.end();

Sada, ako se vratite na terminal i pokrenete skriptu koristeći komandu `node vanilla.js`, trebalo bi da dobijete sledeći izlaz:

[
  { address: '172.253.122.101', ttl: 247 },
  { address: '172.253.122.113', ttl: 247 },
  { address: '172.253.122.100', ttl: 247 },
  { address: '172.253.122.102', ttl: 247 },
  { address: '172.253.122.138', ttl: 247 },
  { address: '172.253.122.139', ttl: 247 }
]

To je to za prvi deo. Očigledan nedostatak korišćenja ugrađenih HTTP/S modula je to što je kod opširan. Klijentske biblioteke kao što je `node-fetch` će vam pomoći da napravite isti program, ali sa jasnijim i sažetijim kodom.

node-fetch

Da biste kreirali isti skript, ali koristeći `node-fetch`, otvorite datoteku `with-fetch.js` i dodajte sledeće importe na vrh:

import fetch from "node-fetch";
import { config } from "dotenv";

Zatim pozovite funkciju `config` kako biste konfigurisali promenljive okruženja i postavili konstante za `API_KEY` i `host` čije A zapise ćemo zahtevati.

config();

const apiKey = process.env.API_KEY;
const host="google.com"

Zatim ćemo definisati funkciju za upućivanje API poziva. Ova funkcija će biti asinhrona.

async function request() {
  // Telo funkcije ide ovde
}

Unutar tela funkcije treba da pozovemo funkciju `fetch` koju smo ranije uvezli iz paketa `node-fetch`.

const response = await fetch("https://api.techblog.co.rs.com/dnsrecord", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": apiKey,
    },
    body: JSON.stringify({ url: host, types: ["A"] }),
});

Zatim, nakon poziva funkcije `fetch`, želimo da parsiramo naš odgovor i obradimo sve greške koje se mogu pojaviti.

if (response.ok) {
    const { data } = await response.json();

    console.log(data.A);
  } else {
    console.log(response);
  }

U ovom trenutku, dodajte poziv funkciji nakon njenog zahteva.

request();

Vaša datoteka sada bi trebala da izgleda ovako:

import fetch from "node-fetch";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host = "google.com";

async function request() {
  const response = await fetch("https://api.techblog.co.rs.com/dnsrecord", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": apiKey,
    },
    body: JSON.stringify({ url: host, types: ["A"] }),
  });

  if (response.ok) {
    const { data } = await response.json();

    console.log(data.A);
  } else {
    console.log(response);
  }
}

request();

A pokretanje ove skripte pomoću komande `node with-fetch.js` trebalo bi da proizvede sledeći izlaz:

[
  { address: '172.253.122.113', ttl: 134 },
  { address: '172.253.122.138', ttl: 134 },
  { address: '172.253.122.100', ttl: 134 },
  { address: '172.253.122.139', ttl: 134 },
  { address: '172.253.122.102', ttl: 134 },
  { address: '172.253.122.101', ttl: 134 }
]

Axios

Na kraju, koristićemo Axios za pristup vdzvdz API-ju. Za početak, uvezimo pakete `dotenv` i `axios`.

import axios from "axios";
import { config } from "dotenv";

Zatim, pozovimo funkciju `config` za podešavanje promenljivih okruženja. Pored toga, sačuvajmo ime hosta i API ključ u odvojenim konstantama.

config();
const host = "google.com";
const key = process.env.API_KEY;

Sada, sačuvajmo URL krajnje tačke API-ja u drugoj konstanti.

const url = "https://api.techblog.co.rs.com/dnsrecord";

Zatim, sačuvajmo podatke koji će biti poslati kao deo tela zahteva u drugu konstantu.

const data = { url: host, types: ["A"] };

Poslednje što treba uraditi pre slanja zahteva je da sačuvamo meta opcije, kao što su zaglavlja, u drugoj konstanti.

const options = {
  headers: {
    "Content-Type": "application/json",
    "x-api-key": key,
  },
};

Na kraju, pozovimo `post` funkciju koju smo ranije uvezli, prosleđujući joj `url`, `data` i `options` promenljive koje smo definisali kao argumente. Pošto će ovo vratiti Promise, tada možete koristiti `then` da obradite odgovor kada se vrati.

axios.post(url, data, options).then(({ data }) => {
  console.log(data.data.A);
});

Na kraju svega ovoga, kod u datoteci `with-axios.js` bi trebalo da izgleda ovako:

import axios from "axios";
import { config } from "dotenv";

config();
const host = "google.com";
const key = process.env.API_KEY;

const url = "https://api.techblog.co.rs.com/dnsrecord";
const data = { url: host, types: ["A"] };
const options = {
  headers: {
    "Content-Type": "application/json",
    "x-api-key": key,
  },
};

axios.post(url, data, options).then(({ data }) => {
  console.log(data.data.A);
});

A kada pokrenete ovu skriptu koristeći komandu `node with-axios.js`, trebalo bi da prikaže sledeći izlaz:

[
  { address: '142.251.163.138', ttl: 60 },
  { address: '142.251.163.113', ttl: 60 },
  { address: '142.251.163.100', ttl: 60 },
  { address: '142.251.163.101', ttl: 60 },
  { address: '142.251.163.102', ttl: 60 },
  { address: '142.251.163.139', ttl: 60 }
]

Završne reči

U ovom članku, kreirali smo skript koristeći tri različita pristupa. Cilj ovoga je bio da se istakne koliko je lako koristiti vdzvdz API i kako ga možemo koristiti u JavaScriptu, posebno u NodeJS-u.

Istražite vdzvdz API dokumentaciju za više informacija.