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 a handleNotFound()
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; namiesto jeho volania si presenter vypýta 404 od metódy handleNotFound() error handlera a zaloguje ho. Pozrite si ApiDecider a endpointy.

3. Obmedzenie požiadaviek ​

php
$results = $rateLimit->consume(new RateLimitContext($api, $request, RateLimitStage::BeforeAuthorization, $ip));
// pridá RateLimit-Policy a RateLimit pre každý výsledok
if (/* niektorý výsledok nie je prijatý */) {
    // 429, Retry-After, vaša chybová odpoveď alebo errorHandler->handleRateLimit()
}

Pred autorizáciou, takže sa počítajú aj neúspešné prihlásenia. Po úspešnej autorizácii (krok 5) presenter zavolá consume() znova s RateLimitStage::AfterAuthorization a identitou, pre politiky s kľúčom identity. Výnimka limitera ide do ErrorHandlerInterface::handle(); výpadok úložiska nie, požiadavka prejde. Pozrite si Obmedzenie 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. Tajné hlavičky a query parametre sa predtým zamaskujú, predvolene na *** (setMaskedLogHeaders(), setMaskedLogQueryParams(), setLogMasking(), pozrite metódy). 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'])
			- addMaskedLogHeader(X-Session)

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? ​

Áno, politika s key: identity beží po autorizácii a počíta podľa identity z AuthorizationIdentityInterface. Ostatné politiky bežia pred ňou, podľa IP alebo endpointu. Pozrite si 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.