Guide · Next.js e React
Guide / Next.js e React
Verifica copertura in Next.js: form completo in un pomeriggio
Il pattern è sempre lo stesso: una Route Handler proxy che custodisce la chiave, un campo con autocomplete debounced e una chiamata con il code del suggerimento scelto. Sotto, il codice pronto da copiare.
1 · Il proxy server-side (obbligatorio)
La chiave API non deve mai finire nel bundle JavaScript. La Route Handler la legge da variabile d’ambiente e inoltra la richiesta; il browser parla solo col tuo dominio.
// app/api/coverage/route.ts — proxy server-side (la chiave resta qui)
import { NextRequest, NextResponse } from "next/server";
export async function GET(req: NextRequest) {
const q = new URL(req.url).searchParams;
const params = new URLSearchParams({
...(q.get("code")
? { code: q.get("code")! }
: { address: `${q.get("address")}, ${q.get("city")}` }),
});
const r = await fetch(
`https://api.netcov.io/coverage/italy?${params}`,
{ headers: { Authorization: `Bearer ${process.env.NETCOV_API_KEY}` } }
);
return NextResponse.json(await r.json(), { status: r.status });
}2 · Il form con autocomplete
Campo città + campo indirizzo. Mostra main_text con le porzioni matches in grassetto; i suggerimenti di tipo civico portano già il code da inviare.
// components/CoverageForm.tsx (estratto)
import { useRef, useState } from "react";
type Item = { kind: string; display: string; main_text?: string; code?: string };
const [city, setCity] = useState("Napoli");
const [items, setItems] = useState<Item[]>([]);
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
async function onType(value: string) {
if (timer.current) clearTimeout(timer.current);
timer.current = setTimeout(async () => {
if (value.trim().length < 3) return setItems([]);
const r = await fetch(
`/api/autocomplete?city=${encodeURIComponent(city)}&address=${encodeURIComponent(value)}`
);
const body = await r.json();
setItems(body.results ?? []); // {kind, display, main_text, matches, code}
}, 250); // debounce: niente raffica di chiamate a ogni tasto
}
// al click su un suggerimento di tipo "civico": usa item.code, poi
// GET /api/coverage?code=<code> e mostra summary.technologiesIl proxy autocomplete (non dimenticarlo)
Il form chiama /api/autocomplete, mai l’API direttamente: stessa chiave server-side, stessa protezione della quota. Al click, invia il code solo se kind === "civico" (una via senza civico non ha codice: lascia digitare il numero).
// app/api/autocomplete/route.ts — stesso pattern della coverage
import { NextRequest, NextResponse } from "next/server";
export async function GET(req: NextRequest) {
const q = new URL(req.url).searchParams;
const params = new URLSearchParams({
city: q.get("city") ?? "",
address: q.get("address") ?? "",
});
const r = await fetch(
`https://api.netcov.io/autocomplete?${params}`,
{ headers: { Authorization: `Bearer ${process.env.NETCOV_API_KEY}` } }
);
return NextResponse.json(await r.json(), { status: r.status });
}- Mostra
summary.technologies+summary.best: è la vista pronta per la vendita. - In caso di 404 con
strict=1, mostra un messaggio che invita a correggere il civico. - Riporta sempre l’attribuzione CC BY 4.0 sotto il risultato (BroadbandMap di Agcom + ANNCSU).
Domande frequenti
Prova gli endpoint senza scrivere codice con l’API Playground, consulta i codici di errore e la guida generale per sviluppatori.
Dove metto la chiave API in un'app Next.js?
Mai nel JavaScript del browser: la chiave vive in una variabile d'ambiente (NETCOV_API_KEY) letta solo da una Route Handler lato server, che inoltra le chiamate all'API e restituisce al client solo i dati di copertura.
Come gestisco l'autocomplete in React?
Con un campo controllato, debounce di almeno 250 ms, minimo 2-3 caratteri e una cache in memoria per coppia città+query. Mostra main_text con le porzioni matches in grassetto; al click usa il code del suggerimento per la chiamata di copertura.
Server Component o Client Component per la verifica?
Il form è un Client Component (interattività), ma la chiamata all'API passa sempre dalla tua Route Handler server-side: così la chiave non esce mai dal server e puoi aggiungere cache e rate limiting tuoi.
Quanta quota consumano autocomplete e copertura?
Ogni chiamata di autocomplete e ogni chiamata di copertura consumano quota del tuo piano (chiavi gratuite: circa 30 richieste al minuto e 1.000 al giorno). L'autocomplete ha un budget separato e più ampio (15x). Debounce di 250 ms e cache di 60 secondi tengono i consumi sotto controllo; /credits mostra i residui in tempo reale.
Pronto a integrare?
Crea la chiave gratuita per integrare, oppure prova gli endpoint nel Playground senza account. Guide per altri stack: Guida Django, Guida WordPress.