Preskočiť na obsah

Spracovanie v ApiPresenteri ​

Tomaj\NetteApi\Presenters\ApiPresenter::run() je celá požiadavka v jednej metóde. Táto stránka ju prechádza krok za krokom podľa zdrojového kódu 3.x.

Otvoriť diagram v plnej veľkosti
KrokKódVýstup
1. CORS hlavičkysendCorsHeaders()
2. Endpoint$this->apiDecider->getApi(...)404 cez DefaultHandler
3. Obmedzenie požiadaviekcheckRateLimit($rateLimit)429, neloguje sa
4. Načítanie parametrovnew ParamsProcessor($handler->params())
5. AutorizáciacheckAuth($authorization, $params)401 alebo 500, neloguje sa
6. Chyby parametroverrorHandler->handleInputParams()400, neloguje sa
7. Handler$handler->handle($params)výnimka: 500
8. Kontrola výstupu$output->validate($response)bez zhody: 500
9. LoggerlogRequest()

1. CORS ​

Hlavičky idú von ako prvé, takže ich má aj 404 či 401 a prehliadač chybu prečíta. setCorsAllowedOrigins() má prednosť pred setCorsHeader(). Pozrite si CORS.

2. Hľadanie endpointu ​

Metóda a parametre routy version, package a apiAction idú do ApiDecider. Neznáma URL dostane DefaultHandler, ktorý prejde zvyšnými krokmi, odpovie 404 a zaloguje sa. Pozrite si ApiDecider a endpointy.

3. Obmedzenie požiadaviek ​

php
$rateLimitResponse = $rateLimit->check();
// pridá X-RateLimit-Limit a X-RateLimit-Remaining
if ($remaining === 0) {
    // 429, Retry-After, vaša chybová odpoveď alebo "Too many requests. Retry after N seconds."
}

Pred autorizáciou, takže neúspešné prihlásenia sa rátajú. Pozrite si Obmedzenie počtu požiadaviek.

4. Načítanie parametrov ​

php
$paramsProcessor = new ParamsProcessor($handler->params());
$params = $paramsProcessor->isError() ? [] : $paramsProcessor->getValues();

Každý parameter sa načíta a overí. Pri chybe je $params prázdne a chyba počká na krok 6.

5. Autorizácia ​

authorized(), ktoré vráti false, ide do handleAuthorization(): 401 s getErrorMessage(). Výnimka ide do handleAuthorizationException(): 500 so správou výnimky, takže do nej nedávajte tajomstvá. Pozrite si Autorizácia.

6. Chyby parametrov ​

Až teraz, po autorizácii, zlý vstup odpovie 400:

json
{"status": "error", "message": "wrong input", "detail": {"page": ["Field is required"]}}

detail sa ukáže, pokiaľ ho konfigurátor neskryje, ako to robí EnvConfigurator v produkcii. Pozrite si Vstupné parametre.

7. Handler ​

handle($params) beží v try. Každý Throwable ide do ErrorHandlerInterface::handle(), ktorý ho zapíše do Tracy a odpovie 500. Pozrite si Spracovanie chýb.

8. Kontrola výstupu ​

Keď ConfiguratorInterface::validateSchema() vráti true, odpoveď sa porovná s každým z outputs(); stačí prvá zhoda. Bez zhody ide do handleSchema() a 500. Prázdne outputs() sa nekontroluje. Každý kód, ktorý handler vracia, potrebuje výstup, čo ukazuje príklad stránkovania pre 400 a 404. Pozrite si Výstupy.

9. Logovanie ​

Ak má kontajner ApiLoggerInterface, požiadavka sa zaloguje s konečným kódom a časom. Hlavičky zo setMaskedLogHeaders() sa zalogujú ako ***. Kroky 3, 5 a 6 už skončili, takže 429, 401 a 400 sa v 3.x nelogujú. Pozrite si Logovanie.

Nastavenie presentera ​

yaml
services:
	apiPresenter:
		factory: Tomaj\NetteApi\Presenters\ApiPresenter
		setup:
			- setCorsAllowedOrigins(['https://app.example.com'])
			- setMaskedLogHeaders()

Toto je jediná služba apiPresenter zo stránky Začíname: pridajte k nej tieto riadky setup:, alebo dajte blok pod rovnakým názvom do iného konfiguračného súboru a Nette ich zlúči. Druhú službu ApiPresenter neregistrujte; dve skončia chybou „Multiple services of type Tomaj\NetteApi\Presenters\ApiPresenter found“.

Trieda je final. Správanie zmeníte cez tieto settery a cez služby, ktoré berie z kontajnera: ErrorHandlerInterface, ConfiguratorInterface, ApiLoggerInterface a IpDetectorInterface.

Časté otázky ​

Prečo zlý vstup so zlým tokenom odpovie 401? ​

Autorizácia (krok 5) beží pred chybami parametrov (krok 6).

Prečo sa moja 400 zmení na 500? ​

Handler vrátil 400, ale žiadny výstup s kódom 400 nezodpovedá. Pridajte ho, alebo v produkcii validáciu vypnite.

Vidí obmedzenie požiadaviek autorizovaného používateľa? ​

Nie, beží pred autorizáciou. Klienta rozlíšte podľa kľúča alebo IP, ako príklad obmedzenia požiadaviek.

Loguje sa čas odpovede aj pri obmedzení požiadaviek alebo autorizácii? ​

Iba pri logovaných požiadavkách: čas od začiatku run() po kontrolu výstupu.

Môžem pridať krok, napríklad ID požiadavky? ​

Nie do run(). Urobte to v autorizácii, v handleri alebo v udalosti Nette onRequest / onResponse.

Vydané pod licenciou MIT.