API-Routen
Hinweis: Wenn Sie den App Router verwenden, können Sie stattdessen Server-Komponenten oder Route-Handler verwenden.
API-Routen bieten eine Lösung zum Aufbau einer öffentlichen API mit Next.js.
Jede Datei im Ordner pages/api
wird zu /api/*
zugeordnet und als API-Endpunkt behandelt, nicht als page
. Sie sind serverseitige Bundles und erhöhen die Größe Ihres Client-seitigen Bundles nicht.
Zum Beispiel gibt die folgende API-Route eine JSON-Antwort mit einem Statuscode von 200
zurück:
Hinweis:
- API-Routen definieren keine CORS-Header, was bedeutet, dass sie standardmäßig nur für denselben Ursprung sind. Sie können dieses Verhalten anpassen, indem Sie den Anforderungshandler mit den CORS-Anfragenhilfen umwickeln.
- API-Routen können nicht mit statischen Exporten verwendet werden. Allerdings können Route-Handler im App Router dies.
- API-Routen werden von der
pageExtensions
-Konfiguration innext.config.js
beeinflusst.
- API-Routen werden von der
Parameter
req
: Eine Instanz von http.IncomingMessageres
: Eine Instanz von http.ServerResponse
HTTP-Methoden
Um verschiedene HTTP-Methoden in einer API-Route zu behandeln, können Sie req.method
in Ihrem Anforderungshandler verwenden:
Anfragenhilfen
API-Routen bieten integrierte Anfragenhilfen, die die eingehende Anfrage (req
) analysieren:
req.cookies
- Ein Objekt, das die von der Anfrage gesendeten Cookies enthält. Standard ist{}
req.query
- Ein Objekt, das die Abfragezeichenfolge enthält. Standard ist{}
req.body
- Ein Objekt, das den voncontent-type
analysierten Body enthält, odernull
, wenn kein Body gesendet wurde
Benutzerdefinierte Konfiguration
Jede API-Route kann ein config
-Objekt exportieren, um die Standardkonfiguration zu ändern:
bodyParser
ist standardmäßig aktiviert. Wenn Sie den Body als Stream
oder mit raw-body
konsumieren möchten, können Sie dies auf false
setzen.
Ein Anwendungsfall für die Deaktivierung der automatischen bodyParsing
ist die Überprüfung des Rohbodys einer Webhook-Anfrage, zum Beispiel von GitHub.
bodyParser.sizeLimit
ist die maximal erlaubte Größe für den analysierten Body, in jedem von bytes unterstützten Format:
externalResolver
ist ein explizites Flag, das dem Server mitteilt, dass diese Route von einem externen Resolver wie express oder connect behandelt wird. Das Aktivieren dieser Option deaktiviert Warnungen für unaufgelöste Anfragen.
responseLimit
ist standardmäßig aktiviert und warnt, wenn der Antwort-Body einer API-Route über 4 MB liegt.
Wenn Sie Next.js nicht in einer serverlosen Umgebung verwenden und die Leistungsauswirkungen verstehen, können Sie diesen Grenzwert auf false
setzen.
responseLimit
kann auch eine Anzahl von Bytes oder eine Zeichenfolge in einem von bytes
unterstützten Format akzeptieren, z.B. 1000
, '500kb'
oder '3mb'
.
Dieser Wert wird die maximale Antwortgröße sein, bevor eine Warnung angezeigt wird. Standard ist 4 MB. (siehe oben)
Antwortehelfer
Das Server-Antwortobjekt, (oft als res
abgekürzt) enthält eine Reihe von Express.js-ähnlichen Hilfsmethoden, um die Entwicklererfahrung zu verbessern und die Geschwindigkeit der Erstellung neuer API-Endpunkte zu erhöhen.
Die enthaltenen Helfer sind:
res.status(code)
- Eine Funktion zum Setzen des Statuscodes.code
muss ein gültiger HTTP-Statuscode seinres.json(body)
- Sendet eine JSON-Antwort.body
muss ein serialisierbares Objekt seinres.send(body)
- Sendet die HTTP-Antwort.body
kann einstring
, einobject
oder einBuffer
seinres.redirect([status,] path)
- Leitet zu einem angegebenen Pfad oder einer URL weiter.status
muss ein gültiger HTTP-Statuscode sein. Wenn nicht angegeben, iststatus
standardmäßig "307" "Temporäre Weiterleitung".res.revalidate(urlPath)
- Seite bei Bedarf neu validieren mitgetStaticProps
.urlPath
muss einstring
sein.
Setzen des Statuscodes einer Antwort
Beim Senden einer Antwort an den Client können Sie den Statuscode der Antwort festlegen.
Das folgende Beispiel setzt den Statuscode der Antwort auf 200
(OK
) und gibt eine message
-Eigenschaft mit dem Wert Hello from Next.js!
als JSON-Antwort zurück:
Senden einer JSON-Antwort
Beim Senden einer Antwort an den Client können Sie eine JSON-Antwort senden, die ein serialisierbares Objekt sein muss. In einer realen Anwendung möchten Sie dem Client möglicherweise den Status der Anfrage mitteilen, abhängig vom Ergebnis des angeforderten Endpunkts.
Das folgende Beispiel sendet eine JSON-Antwort mit dem Statuscode 200
(OK
) und dem Ergebnis der asynchronen Operation. Es ist in einem Try-Catch-Block enthalten, um etwaige Fehler zu behandeln, wobei der entsprechende Statuscode und die Fehlermeldung abgefangen und an den Client zurückgesendet werden:
Senden einer HTTP-Antwort
Das Senden einer HTTP-Antwort funktioniert genauso wie beim Senden einer JSON-Antwort. Der einzige Unterschied ist, dass der Antworttext eine Zeichenkette
, ein Objekt
oder ein Puffer
sein kann.
Das folgende Beispiel sendet eine HTTP-Antwort mit dem Statuscode 200
(OK
) und dem Ergebnis der asynchronen Operation.
Weiterleitung zu einem bestimmten Pfad oder URL
Am Beispiel eines Formulars möchten Sie den Client möglicherweise nach dem Absenden des Formulars zu einem bestimmten Pfad oder einer URL weiterleiten.
Das folgende Beispiel leitet den Client zum /
-Pfad weiter, wenn das Formular erfolgreich abgesendet wurde:
Hinzufügen von TypeScript-Typen
Sie können Ihre API-Routen typsicherer machen, indem Sie die Typen NextApiRequest
und NextApiResponse
aus next
importieren. Zusätzlich können Sie auch Ihre Antworddaten typisieren:
Hinweis: Der Body von
NextApiRequest
istany
, da der Client eine beliebige Payload einschließen kann. Sie sollten den Typ/die Form des Body zur Laufzeit validieren, bevor Sie ihn verwenden.
Dynamische API-Routen
API-Routen unterstützen dynamische Routen und folgen denselben Dateinamenregeln wie pages/
.
Nun wird eine Anfrage an /api/post/abc
mit dem Text: Post: abc
antworten.
Catch-All API-Routen
API-Routen können erweitert werden, um alle Pfade zu erfassen, indem drei Punkte (...
) in eckigen Klammern hinzugefügt werden. Beispielsweise:
pages/api/post/[...slug].js
passt auf/api/post/a
, aber auch auf/api/post/a/b
,/api/post/a/b/c
und so weiter.
Hinweis: Sie können andere Namen als
slug
verwenden, wie zum Beispiel:[...param]
Übereinstimmende Parameter werden als Abfrageparameter (slug
im Beispiel) an die Seite gesendet und sind immer ein Array. Der Pfad /api/post/a
wird also das folgende Abfrageobjekt haben:
Und im Fall von /api/post/a/b
und jedem anderen übereinstimmenden Pfad werden neue Parameter dem Array hinzugefügt:
Beispiel:
Nun wird eine Anfrage an /api/post/a/b/c
mit dem Text: Post: a, b, c
antworten.
Optionale Catch-All API-Routen
Catch-All-Routen können optional gemacht werden, indem der Parameter in doppelte eckige Klammern ([[...slug]]
) gesetzt wird.
Beispielsweise wird pages/api/post/[[...slug]].js
auf /api/post
, /api/post/a
, /api/post/a/b
und so weiter passen.
Der Hauptunterschied zwischen Catch-All- und optionalen Catch-All-Routen besteht darin, dass bei optionalen Routen auch die Route ohne Parameter übereinstimmt (/api/post
im obigen Beispiel).
Die Abfrageobjekte sehen wie folgt aus:
Einschränkungen
- Vordefinierte API-Routen haben Vorrang vor dynamischen API-Routen, und dynamische API-Routen vor Catch-All-API-Routen. Betrachten Sie die folgenden Beispiele:
pages/api/post/create.js
- Wird/api/post/create
zuordnenpages/api/post/[pid].js
- Wird/api/post/1
,/api/post/abc
usw. zuordnen, aber nicht/api/post/create
pages/api/post/[...slug].js
- Wird/api/post/1/2
,/api/post/a/b/c
usw. zuordnen, aber nicht/api/post/create
,/api/post/abc
Edge API-Routen
Wenn Sie API-Routen mit der Edge-Laufzeit verwenden möchten, empfehlen wir, schrittweise den App Router zu übernehmen und stattdessen Route-Handler zu verwenden.
Die Signatur der Route-Handler-Funktion ist isomorph, was bedeutet, dass Sie dieselbe Funktion für Edge- und Node.js-Laufzeiten verwenden können.