contributte/apitte – pohodlna API knihovna (PSR-7, middlewares, openapi, examples)
- Felix
- Nette Core | 1196
contributte/apitte
Potrebujete na svem projektu vytvorit API? Pak bych vam rad ukazal knihovnu Apitte z rodiny contributte balicku.
Apitte uz je tu s nami nejaky ten patek a uz ma pres >250k stazeni. Pouziva ho cela rada firem a stal se soucasti desitek projektu.
Zakladnim stavebnim kamenem jsou tzv. controllery. Ty si muzeme predstavit jako odlehcene presentery. Ktere se soustredi jenom na prijem request a odeslani response.
Zaroven Apitte stavi na PSR-7. Jedna se o koncept (na kterem se dohodla rada PHP vyvojaru, https://www.php-fig.org/psr/psr-7/) a ten deklaruje jak vypada request a response. Zejmena jake ma metody a jak se s nim pracuje.
Dalsi skvelou feature je podpora OpenAPI specifikace. Mnozi z vas to budou znat spis pod pojmem Swagger. Jedna se o format, ktery popisuje jake endpointy se v API nachazi, co prijimaji za parametry a co naopak vraci. K jakym chybam muze dojit a jakou strukturu odpoved ma. To se velmi hodi.
Posledni takova tresnicka je podpora middlewares. Middlewary jsou zase definovane tridy, ktere muzete zapojit do stacku (middleware chain) a ty se pak dle poradi provolavaji. Muzete si je i predstavit jako takova pluginy, ktere jen do aplikaci zapojite. A tech pluginu uz existuje cela rada.
Jak takovy ukazkovy Apitte controller muze vypadat? Treba takto.
/**
* @Path("/hello")
*/
final class HelloController implements IController
{
/**
* @Path("/world")
* @Method("GET")
*/
public function index(ApiRequest $request, ApiResponse $response): ApiResponse
{
return $response->writeBody('Hello world!');
}
}
Features
composer require contributte/apitte
- PHP 7.3+
- Nette 3.0+
- PSR-7 (req/res), PSR-15 (middlewares)
- OpenAPI (generovani schema z anotaci)
- Content negotiation (odpoved podle suffixu nebo hlavicky)
- Spousta testu
- …vice na Githubu ⏭
Feedback
Feedback je vitan, jeste vice jsou vitane pull-requesty.
Examples
Existuje ukazkovy projekt na Githubu i realne demo.
- Felix
- Nette Core | 1196
Apitte bylo drive rozdelene do nekolika samostatnych repozitaru (ve stejnojmenne organizaci) a Composer balicku. Byla to vize, ktera se ale ukazala jako ne uplne dobra. Vsichni totiz pouzivali Apitte jako cely stack a ne jednotlive balicky.
Proto jsem se rozhodl, ze se Apitte spoji pod jeden velky repozitar. Vycisti se od nepotrebnych veci, aktualizuje PHP atd. Bude to pro vsechny vice srozumitelne, jednoduse uchopitelne a pro me jednodussi na vyvoj.
Vse se dohodlo v ramci Contributte RFC: https://github.com/…te/issues/50
Aktualne se dokoncilo mergnuti do jednoho repozitare contributte/apitte. Poprosil
bych vsechny o otestovani. Zmena by mela byt vic nez jednodussi.
contributte/apitte:v0.9
odpovida poslednim verzim
apitte/[balicek]:v0.8
. Zadna zmena ve vasich projektech by nemela
nastat.
Puvodni:
{
"require": {
"apitte/core": "^0.8",
"apitte/debug": "^0.8",
"apitte/openapi": "^0.8",
"apitte/middlewares": "^0.8",
"apitte/negotiation": "^0.8",
"apitte/presenter": "^0.8",
"apitte/console": "^0.8"
},
"prefer-stable": true,
"minimum-stability": "dev"
}
Nove:
{
"require": {
"contributte/apitte": "^0.9"
},
"prefer-stable": true,
"minimum-stability": "dev"
}
- ondraLE
- Člen | 23
Mám nyní problém s instalací API pro poslední nette, nainstaluji webprojekt, updatuji composer a chci instalovat apitte:
composer require contributte/apitte
composer to zahodí, kvůli nesouladu \Nette\Utils, jsou nyní v základu na 4.0:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Root composer.json requires contributte/apitte v0.10 -> satisfiable by contributte/apitte[v0.10.0].
- contributte/apitte v0.10.0 requires nette/utils ^3.2.7 -> found nette/utils[v3.2.7, v3.2.8, v3.2.9] but it conflicts with your root composer.json require (^4.0).
pokud to instaluji přes ukázky api-skeleton, sice to jde, ale je tam
„abandoned Apite\Code“ a pak nefunguje PSR-7 streamy atd. pro PHP 8.2.1,
jak to vyřešit. Mohu sice „natvrdo“ přepsat /vendors/guzzle, ale to není
ideální řešení.
Díky za radu, případně jasný postup, jak nyní na PHP 8.2.1 postupovat
při instalaci nette + apitte, staré ukázky již nefugují.
- ondraLE
- Člen | 23
Felix napsal(a):
Ahoj @ondraLE. Apitte jeste neni pripraveno na Nette 4, resp. nette/utils 4.0.
Ok a je nějaká cesta (i např. downgrade PHP), jak používat Apitte 0.10 a nette? Zamýšlená aplikace bude mít jak GUI tak nějaké API endpointy pro externí aplikace, resp. co a v jaké verzi lze použít, aby to šlo a zaroveň nepsalo o abandoned Apitte\Core? Nebo ještě lépe, nešlo by updatovat příklady?
- tom
- Člen | 171
Chci vytvorit API projekt ke stavajicimu eshopu. Udelam to jako oddelenou webovou aplikaci, ktera pobezi na sve adrese, napr. api.neco.cz. Nez zacnu chci se zeptat na jednu vec. Pomoci composeru si mam nejdrive nainstalovat prazdny nette projekt a do nej pak jeste apitte? Nebo mam pouzit pouze apitte a zbytek dodelat rucne? U toho API web jako takovy nebude potreba mozna max swagger. Diky za nasmerovani
- Felix
- Nette Core | 1196
Ahoj @tom, da se vyuzit i z predpripraveneho https://github.com/…tte-skeleton.
Zalezi co ti vyhovuje, zadna z tech cest neni spatna. Jen pak dej pozor co z composer.json realne pouzivas a co ne. Idealne at v tom mas poradek jako na plose.
- tom
- Člen | 171
ondraLE napsal(a):
Felix napsal(a):
Ahoj @ondraLE. Apitte jeste neni pripraveno na Nette 4, resp. nette/utils 4.0.
Ok a je nějaká cesta (i např. downgrade PHP), jak používat Apitte 0.10 a nette? Zamýšlená aplikace bude mít jak GUI tak nějaké API endpointy pro externí aplikace, resp. co a v jaké verzi lze použít, aby to šlo a zaroveň nepsalo o abandoned Apitte\Core? Nebo ještě lépe, nešlo by updatovat příklady?
@ondraLE ahoj, podarilo se ti tvuj problem nejak resit? dostal jsem se ted do stejneho bodu, tak se chci zeptat, kde jsi co upravil. Diky
- ondraLE
- Člen | 23
tom napsal(a):
ondraLE napsal(a):
Felix napsal(a):
Ahoj @ondraLE. Apitte jeste neni pripraveno na Nette 4, resp. nette/utils 4.0.
Ok a je nějaká cesta (i např. downgrade PHP), jak používat Apitte 0.10 a nette? Zamýšlená aplikace bude mít jak GUI tak nějaké API endpointy pro externí aplikace, resp. co a v jaké verzi lze použít, aby to šlo a zaroveň nepsalo o abandoned Apitte\Core? Nebo ještě lépe, nešlo by updatovat příklady?
@ondraLE ahoj, podarilo se ti tvuj problem nejak resit? dostal jsem se ted do stejneho bodu, tak se chci zeptat, kde jsi co upravil. Diky
Ahoj, nakonec jsem to přepsal natvrdo, teď jsem nekoukal, jestli už vyšla nová verze nette/utils. Další apku, která potřebuje GUI i API jsem nakonec dělal klasicky přes controllery, jen s tím, že mám nějaký BASEController pro GUI a BASEController pro API, který mi tam nastrká více parametrů. Apitte a nové Nette jsem nerozchodil. :(