Apitte – správný content-type (JSON/XML) při error
- woytam
- Člen | 14
Ahoj,
snažím se vytvořit API s podporou JSON a XML, ale errory mi to vždy vyhodí
v JSON nezávisle na požadovaném formátu.
Například /api/v1/data.xml
vrací XML, ale pokud nejsem
přihlášen a chybu vyhodí RequestAuthenticationDecorator
,
odešle se JSON.
Používám Decorator
a Negotiation
pluginy.
Konfigurace:
Když v RequestAuthenticationDecorator
mám
public function decorateRequest(ApiRequest $request, ApiResponse $response): ApiRequest {
throw new ClientErrorException('Invalid credentials, authentication failed.', 403);
}
odešle se vždy JSON nezávisle na nastaveném endpointu. I příkaz
throw new EarlyReturnResponseException($response)
odešle JSON.
Nepodařilo se mi nikde pořádně dohledat, jak nastavit Apitte, aby vždy
bralo v potaz požadovaný Content-Type
?
- Felix
- Nette Core | 1258
Pro budouci generace davam navod, my jsme to vyresili po emailu.
Tam je problem, ze logika, ktera se stara o prevadeni vystupnich dat do ruznych formatu nepocita s tim, ze by jsi ten error vyhodil jeste predtim nez doputuje do controlleru, resp. endpointu. Protoze podle controlleru, resp. endpointu, se pozna, jake podporuje koncovky. Tim, ze ten error vyhodis jeste predtim, tak se cela takhle logika nepouzije.
Nicmene, neni to tezky udelat, posilam ukazkovou tridu.
Predpokladam, ze z kodu je to patrne. Podle toho, jestli to konci na .xml nebo .json se vyhodi SnapshotException. Pokud se nic z toho nepouzije, tak to pokracuje jako predtim.
- woytam
- Člen | 14
Super, díky, funguje.
Nicméně bych se zeptal, zda neexistuje nějaké „úhlednější“
řešení. Přijde mi to tady, že řeším dvě stejné věci na dvou různých
místech. Tedy kontrolu požadovaného typu a následný převod na správný
formát.
To už mi skoro přijde lepší provádět kontrolu přihlášení až
v Controlleru.
A jen taková druhá otázečka, má nějaký smysl
když v nových verzích je stejně funkce definovaná již
s apiException
Dříve bývalo Throwable
kde to smysl mělo.
- Felix
- Nette Core | 1258
Nicméně bych se zeptal, zda neexistuje nějaké „úhlednější“ řešení. Přijde mi to tady, že řeším dvě stejné věci na dvou různých místech. Tedy kontrolu požadovaného typu a následný převod na správný formát.
To už mi skoro přijde lepší provádět kontrolu přihlášení až v Controlleru.
Tak ono vracet data podle typu odpovedi (JSON a XML) je celkem narocna vec. Ale chapu te. Zkusim se zamyslet, jestli by to neslo nejak zjednodusit.
if ($error instanceof ApiException)
Uz to nema smysl. :-) Diky za hint.