Un endpoint API è un URL specifico in cui un’API riceve le richieste per una risorsa – abbinato a un metodo HTTP, definisce un’operazione. È questa seconda parte che la maggior parte delle definizioni salta, ed è proprio quella a sciogliere la confusione classica: GET /users/42 e DELETE /users/42 condividono un indirizzo ma sono due endpoint diversi, come una porta si comporta in modo diverso a seconda che si batta o si giri la chiave.
Punti chiave
| Domanda | Risposta |
|---|---|
| La formula | URL di base + path (+ metodo) = un’operazione su una risorsa |
| vs. l’API | API = il contratto intero · endpoint = un punto di accesso al suo interno |
| Path vs. query | Il path identifica quale risorsa · la query dice come restituirla |
| La denominazione | Nomi al plurale, minuscole, annidamento basso – il verbo lo porta il metodo |
| La sicurezza | Ogni endpoint è superficie d’attacco – compresi quelli dimenticati |
Anatomia dell’URL di un endpoint API
Ogni pezzo di un vero URL di richiesta, etichettato – secondo la grammatica della RFC 3986:
GET https://api.example.com/v1/users/42/posts?status=published&limit=20
GET metodo – l'azione; parte dell'identità dell'operazione
https schema – TLS, non negoziabile
api.example.com host ┐ l'URL di base, condiviso da
/v1 versione ┘ ogni endpoint dell'API
/users/42/posts path – la risorsa: i post dell'utente 42
42 parametro di path – identifica QUALE risorsa
?status=published parametri di query – COME restituirla:
&limit=20 filtrare, ordinare, paginare (fuori dall'identità)
Chiamare un endpoint dal codice applicativo – l’SDK compone URL, metodo e autenticazione al posto di chi scrive:
// JavaScript / Node.js — Back4app JS SDK
// Every class gets endpoints automatically — this call hits one
const query = new Parse.Query('Todo');
query.equalTo('done', false);
query.limit(10);
const todos = await query.find();
// Endpoint used: GET /classes/Todo?where={"done":false}&limit=10 // Flutter / Dart — Back4app Flutter SDK
// Every class gets endpoints automatically — this call hits one
final query = QueryBuilder<ParseObject>(ParseObject('Todo'))
..whereEqualTo('done', false)
..setLimit(10);
final response = await query.query();
// Endpoint used: GET /classes/Todo?where={"done":false}&limit=10 // iOS / Swift — Back4app Swift SDK
// Every class gets endpoints automatically — this call hits one
let query = Todo.query("done" == false)
.limit(10)
let todos = try await query.find()
// Endpoint used: GET /classes/Todo?where={"done":false}&limit=10 // Android / Kotlin — Back4app Android SDK
// Every class gets endpoints automatically — this call hits one
val query = ParseQuery.getQuery<ParseObject>("Todo")
query.whereEqualTo("done", false)
query.limit = 10
val todos = query.find()
// Endpoint used: GET /classes/Todo?where={"done":false}&limit=10 Endpoint vs. API vs. URL vs. route
La disambiguazione a quattro termini che nessuna pagina di classifica propone:
| Termine | Che cos’è | Vocabolario di chi |
|---|---|---|
| API | Il contratto intero: tutte le risorse, le operazioni e le regole | Di tutti |
| Endpoint | Un punto di accesso – un URL (+ metodo) che riceve le richieste per una risorsa | La vista di chi consuma |
| URL | La stringa di indirizzo che localizza l’endpoint (RFC 3986) | La vista della rete |
| Route | La definizione lato server: pattern di path + metodo + codice dell’handler | La vista di chi implementa |
Endpoint e route sono la stessa cosa vista dalle due estremità: un framework dichiara una route, un client chiama un endpoint. E l’OpenAPI Specification formalizza il quadro completo – un’API è un insieme di path, ogni path contiene operazioni indicizzate per metodo, e “quanti endpoint ha questa API?” è in realtà un conteggio di operazioni.
Parametri di path vs. parametri di query
La regola che risolve gran parte dei dibattiti di progettazione – l’identità nel path, la modifica nella query:
| Domanda a cui risponde il parametro | Il suo posto | Esempio |
|---|---|---|
| Quale risorsa? | Path | /users/42, /orders/2026-1187 |
| Quale collezione collegata? | Path | /users/42/posts |
| Filtrare i risultati? | Query | ?status=published |
| Ordinare o paginare? | Query | ?sort=-createdAt&limit=20 |
| Ritocchi opzionali di comportamento? | Query | ?include=author&fields=title |
La distinzione ha delle conseguenze: i parametri di path fanno parte dell’identità della risorsa (e della chiave di cache); i parametri di query ne modellano la rappresentazione. Una risorsa raggiungibile solo tramite parametri di query (/getData?type=user&id=42) è il classico odore di livello 0 da cui parte la scala di maturità REST.
Dare un buon nome agli endpoint
Chi consuma un’API la giudica dalla sua lista di endpoint prima di leggere una parola di documentazione:
| Convenzione | Bene | Male |
|---|---|---|
| Nomi, non verbi – il verbo è il metodo | POST /orders | POST /createOrder |
| Collezioni al plurale | /users, /users/42 | /user/42 |
| Minuscole, con trattini | /purchase-orders | /PurchaseOrders, /purchase_orders |
| Annidamento basso (un livello) | /users/42/posts | /users/42/posts/8/comments/3/likes |
| Prefisso di versione con una politica | /v1/… + finestre di deprecazione | Rompere /v1 in silenzio |
| Pattern prevedibili | La stessa forma per ogni risorsa | Ogni risorsa con il suo dialetto |
Mettere in sicurezza gli endpoint: la checklist
Ogni endpoint è una porta, e chi attacca le prova tutte – comprese quelle che si sono dimenticate. La checklist compatta: solo HTTPS; autenticazione su ogni endpoint (nessuna eccezione “interna” raggiungibile da internet); autorizzazione per risorsa, non solo per API – l’utente 42 che legge /users/43/orders è il classico buco di broken object level authorization; validazione degli input su path, query e body; rate limiting dimensionato al costo dell’endpoint; paginazione limitata perché nessun endpoint restituisca collezioni senza tetto; igiene degli errori (nessuno stack trace, nessuna fuga di esistenza). E il punto che i team mancano: l’inventario. Gli endpoint “zombie” – non documentati, deprecati ma vivi – hanno una voce tutta loro nell’OWASP API Security Top 10: un endpoint che non si ricorda è un endpoint che non si difende.
Casi d’uso tipici
Dove ragionare per endpoint si guadagna il posto:
- Consumare un’API di terze parti – il catalogo di endpoint della documentazione è il prodotto; padroneggiarne l’anatomia è il modo di leggerlo.
- Progettare un’API pubblica – decisioni di denominazione, collocazione dei parametri e versionamento con cui chi consuma convive per anni.
- Fare il debug delle integrazioni – riprodurre una chiamata dell’SDK come richiesta grezza all’endpoint con curl separa le colpe del client da quelle del server.
- Configurare gateway e monitoring – rate limiting, avvisi e regole di accesso si dichiarano per endpoint.
- Audit di sicurezza – l’inventario degli endpoint è la mappa della superficie d’attacco; l’audit parte dalla sua enumerazione.
Serve un nuovo endpoint? Matrice decisionale
| Situazione | Risposta |
|---|---|
| Nuovo tipo di risorsa | Nuovo endpoint (/invoices) |
| Stessa risorsa, risultati più ristretti | Endpoint esistente + parametri di query |
| Stesso URL, azione diversa | Stesso path, metodo diverso |
| Una schermata ha bisogno di cinque endpoint | Valutare un endpoint composito – ma vedere la proliferazione, più sotto |
| Rappresentazione variante (campi, formato) | Parametro di query o negoziazione del contenuto, non un nuovo path |
| Modifica che rompe forma o semantica | Nuovo prefisso di versione, con una finestra di deprecazione |
Limiti e trade-off
- La proliferazione di endpoint è debito vero. Gli endpoint per schermata e per team si accumulano; ciascuno è documentazione, test, monitoring e superficie d’attacco per sempre. Pochi endpoint ben progettati battono molti endpoint su misura.
- Le forme rigide si adattano male ad alcuni consumatori. Un endpoint restituisce ciò che restituisce – è il trade-off di overfetching/underfetching a cui le API a query modellabili esistono per rispondere.
- Gli URL sono contratti. Rinominare un endpoint rompe ogni consumatore; conviene scegliere nomi con cui si possa convivere, perché migrare significa versionamento, redirect e calendari di deprecazione.
- Il metodo è invisibile nel linguaggio corrente. “L’endpoint /users” nasconde se si parli di lettura o di scrittura – la precisione conta nella documentazione, nei log e nelle regole di sicurezza.
- Contare gli endpoint non misura nulla. Un’API con 12 endpoint coerenti batte regolarmente un’API con 400 endpoint improvvisati; il segnale di qualità è la governance, non il volume.
Endpoint API su Back4app
Back4app è una piattaforma open-source di Backend as a Service (BaaS) che combina database gestito, API REST e GraphQL generate automaticamente, autenticazione, archiviazione di file e funzioni serverless con Cloud Code. Qui gli endpoint sono derivati, non progettati: creare una classe Todo espone all’istante /classes/Todo e /classes/Todo/:objectId con il set completo di metodi – il pattern delle API generate automaticamente – più endpoint permanenti per utenti, sessioni, file e funzioni, tutti con un solo URL di base, autenticazione a chiavi e permessi per classe. I tab di codice ne mostrano la conseguenza pratica: l’SDK compone endpoint, metodo e credenziali, e la checklist qui sopra – coerenza dei nomi, autenticazione in ogni punto, query limitate, zero zombie – arriva come comportamento della piattaforma invece che come disciplina in sede di revisione. Le operazioni su misura ottengono endpoint nello stesso modo: basta fare il deployment di una funzione Cloud Code e /functions/nomeFunzione esiste.
Domande frequenti
Che cos'è un endpoint API in parole semplici?
L'URL specifico in cui un'API riceve le richieste relative a una risorsa: ogni endpoint è una porta d'ingresso nell'API. Una richiesta a /users/42 con il metodo GET chiede i dati dell'utente 42; lo stesso path con DELETE ne chiede la rimozione. L'API è l'intero edificio; gli endpoint sono le sue porte indirizzabili.
Qual è un esempio di endpoint API?
https://api.example.com/v1/users/42 – un URL di base (schema, host e versione), poi un path che nomina la risorsa. Equivalenti reali: l'endpoint /repos/OWNER/REPO di una piattaforma di hosting del codice, oppure l'endpoint /classes/Todo che un'app Back4app genera automaticamente per una classe di dati Todo.
Qual è la differenza tra un'API e un endpoint?
L'API è il contratto intero: l'insieme completo di regole, risorse e operazioni che un servizio espone. Un endpoint è un singolo punto di accesso al suo interno. Un'API espone molti endpoint, e la documentazione di un'API ne è in larga parte il catalogo.
Un endpoint è la stessa cosa di un URL?
Non esattamente. L'endpoint si esprime sotto forma di URL, ma l'URL è solo l'indirizzo; l'endpoint è il punto di interazione che quell'indirizzo identifica. La documentazione scrive di norma gli endpoint come path, con l'URL di base sottinteso – e, a essere rigorosi, il metodo HTTP fa parte di ciò che definisce l'operazione a quell'indirizzo.
Uno stesso URL può corrispondere a più endpoint?
Sì. GET /users/42 e DELETE /users/42 condividono un URL ma sono operazioni diverse: è per questo che lo standard OpenAPI modella un'API come un insieme di path, ciascuno con più operazioni indicizzate per metodo. Quando si contano gli "endpoint", in realtà si contano operazioni.
Qual è la differenza tra un endpoint e una route?
Una questione di prospettiva. La route è la definizione lato server: un pattern di path, un metodo e una funzione handler nel framework. L'endpoint è l'URL esposto al client in cui quella route è raggiungibile. La stessa cosa vista dalle due estremità della richiesta.
Come si trovano gli endpoint di un'API?
Tre vie, in ordine di affidabilità: leggere la documentazione o la specifica OpenAPI leggibile da una macchina, che enumera ogni path e ogni operazione; osservare il traffico reale nella scheda di rete degli strumenti per sviluppatori del browser, filtrata su fetch/XHR; oppure provare le chiamate con curl e un client API per confermarne il comportamento.
Come si mette in sicurezza un endpoint API?
Ogni endpoint va trattato come superficie d'attacco: solo HTTPS, autenticazione su ogni route, autorizzazione al minimo privilegio, validazione degli input, rate limiting, paginazione limitata e messaggi di errore che non lascino filtrare nulla dei meccanismi interni. Poi va tenuto un inventario: gli endpoint "zombie" dimenticati figurano tra le principali falle di sicurezza delle API.