====== Ktor ======
Ktor je významný doplnok programovania v Kotlin-e. Zabezpečuje komunikáciu cez API. Vytvára stranu **Servera** aj **Klienta**. Komunikácia môže byť na báze HTTP, alebo WebSocket. Ktor využíva **[[kotlin-coroutines|Coroutines]]**.
===== Server =====
Ktor Server vybuduje API rozhranie pre IP komunikáciu. Pre **dátové** projekty sa častejšie využije REST API komunikácia, kedy sa [[restapi_baseinfo|protokolom HTTP]] zasielajú požiadavky (Request) a naspäť sa vracajú odpovede (Response).
Projekt sólo servera s REST API je možné vygenerovať, upraviť a spustiť veľmi jednoducho a použiť napríklad pre testovací ''Mock server'', ktorý pobeží na desktope, alebo mobilných ARM zariadeniach (tablet, telefón, ...). Už pri vygenerovaní projektu, build-nutí a spustení je k dispozícii základný programový a funkčný server.
> pre JVM (desktopy) sa používa generátor: [[https://start.ktor.io/settings|New Ktor Project]] a ďalej postupovať podľa [[https://www.restapi.sk/doku.php?id=kotlin-ktor#vytvorenie_projektu|popisu nižšie]]
> pre Multiplatform využi IntelliJ Idea - nový MP projekt s Ktor
Server pri príjme požiadavky zabezpečuje Smerovanie (Routing) a podrobné Trasy (Route) k cieľom, Príklad čiastočne funkčného kódu:
routing {
route("/") {
get("") { call.respondText("Please define path.") }
}
route("/article") {
get { call.respond(repository.allArticles) }
get ("/byId/{idArticle}") { call.respond(repository.articleById(call.parameters["idArticle"])) }
post { call.receive() /* code for add or update */ }
delete("/{id}") { /* code for remove */ }
}
}
Príklad príkazu ''curl'' pre **POST** a **DELETE**:
# POST:
curl -v --header "Content-Type: application/json" --request POST --data '{"name":"MyTest2","description":"Task for my test2","priority":"High"}' 0.0.0.0:8080/tasks
# DELETE:
curl -v --request DELETE 0.0.0.0:8080/tasks/MyTest
# switch -v showing detail info of response from server
==== Vytvorenie projektu ====
Generovť projekt je možné pomocou web rozhrania, alebo aplikácie **Ktor CLI**, alebo priamo v IDE.
=== Generovanie pomocou web rozhrania ===
> Vytvorenie projektu na [[https://ktor.io/docs/server-create-a-new-project.html|webe Ktor]].
Na stránke [[https://start.ktor.io/settings|New Ktor Project]] po vyplnení mena projektu sa v **Configure** zvolia parametre (možné ponechať predvolené). Pre pridanie **Plugins** v spondej tabuľke sa použije **Add** (možné bez ponechať výberu), ale každopádne je vhodné zmapovať pluginy pre ich budúce použitie. **Preview** poskyruje náhľad na štruktúru projektu. \\
Nakoniec sa projekt stiahne a uloží pomocou **Download**. Potom už postačuje ZIP rozbaliť na vhodné miesto. \\
- Generátor je vhodné použiť, ak nie je dostupné profi IDE s možnosťou generovania projektu **Ktor**. \\
- Zároveň je možné vygenerovaný projekt spravovať v ľahších IDE (VSC, ...)
== Oživenie projektu ==
Ak je projekt pripravený, tak sa ďalej bude pracovať v jeho zložke. (Príkazy sú vhodné pre Shell ktorý je aj vo Windows...)
cd ~/
Nastaviť skript ako spustiteľný:
chmod +x ./gradlew
Zostavenie projektu:
./gradlew build
Spustenie projektu:
./gradlew run
Overenie funkčnosti v prehliadači na adrese: [[http://0.0.0.0:8080]]
== Otvorenie projektu v IDE IntelliJ IDEA ==
cd ~/
open -na "IntelliJ IDEA CE.app" . # open my project if IDE is in /Applications/
prípadne:
open -a "IntelliJ IDEA CE.app" .
alebo skrátene za predpokladu správnej konfigurácie [[https://www.jetbrains.com/help/idea/2025.2/working-with-the-ide-features-from-command-line.html?Working_with_the_IDE_Features_from_Command_Line&keymap=macOS#standalone|Path]]:
idea .
=== Nový projekt pomocou Ktor CLI ===
Predpokladá sa že už je nainštalovaný [[https://brew.sh/|Homebrew]] \\
Inštalácia Ktor CLI:
brew install ktor
Vytvorenie projektu:
mkdir ~/MyKtorProjects
cd ~/MyKtorProjects
brew upgrade ktor
ktor new
cd
chmod +x ./gradlew
./gradlew build
./gradlew run
Pre výber doplnkov použi šípky, tabelátor a enter. Vytvorenie : Ctrl+G
=== aktuálna IP adresa PC ===
ipconfig getifaddr en0 # ipv4 only
# or
ifconfig | grep "inet " | grep -v 127.0.0.1; # other IP of device
# other
curl ifconfig.me # ipv6
# see more for curl command: https://curl.se/
==== Testovanie projektu ====
> KtorIo : [[https://ktor.io/docs/server-create-a-new-project.html#write-an-integration-test|Integračný test]]
> KtorIo : [[https://ktor.io/docs/server-requests-and-responses.html#add-unit-tests|Jednotkové testy]]
Pri testovaní je vhdoné vytvoriť ''@Test'' funkcie pre všetky trasy. Test beží v oddelenom priestore od servera. Pre test je nutné vytvoriť zložky ''test/kotlin'' v ''src'' (vedľa ''main'').
=== Obsluha chýb ===
> KtorIo : [[https://ktor.io/docs/server-create-a-new-project.html#register-error-handlers|Pridanie pluginu StatusPage]]
Ak doplnuk **StatusPage** nebol vybraný a pridaný pri tvorbe projektu, potom je vhodné ho pridať manuálne.
==== RESTful API ====
> KtorIo : [[https://ktor.io/docs/server-create-restful-apis.html|Ako vytvoriť RESTful API v Kotlin s Ktor]] - nový projekt s vybranými doplnkami: Routing, Content Negotiation, Kotlinx.serialization, Static Content
RESTful API komunikuje JSON formátom dát. Teda neprijíma telo odoslané pomocou ''submit'' v HTML a taktiež pre zobrazenie výsledku nevytvára statický HTML obsah stránky, ako v príkladoch vyššie.
* **Content Negotiation** - skúma typ obsahu //request//, aby poskytol správny //response//. Klient HTTP indikuje typ obsahu v hlavičke kľúčom ''Accept'' (jeden či viac typov, napríklad: text/html, application/xhtml+xml, application/xml;q=0.9, image/avif, image/webp,image/apng, */*;q=0.8, application/signed-exchange;v=b3;q=0.7).
=== Testovanie projektu ===
> KtorIo : [[https://ktor.io/docs/server-create-restful-apis.html#create-unit-tests|trasy pomocou klienta Ktor]] a JUnit
> KtorIo : [[https://ktor.io/docs/server-create-restful-apis.html#unit-tests-via-jsonpath|testy pomocou JsonPath]]
==== Web stránka pomocou Kotlin/Ktor ====
> KtorIo : [[https://ktor.io/docs/server-create-website.html|interaktívna web stránka]] s Ktor a Thymeleaf