Ditt eget API i skyen — en rask og enkel gjennomgang av hvordan du får tilgang til dataen din når som helst, fra hvor som helst

Håkon Meyer Tørnquist
Capra Consulting
Published in
6 min readApr 27, 2018

Enten det er for å utføre forretningslogikk, for å eksponere en database, for å ha en proxy til et tredjeparts API som ikke produserer datatypen du vil ha (jeg ser på deg, Yr), eller bare fordi du har lyst: En backend med et RESTfullt API på toppen kan løse mange problemer i web-verdenen.

Å sette opp en slik backend er ikke spesielt vanskelig. Uansett hvilke teknologier du liker best, om det er Java, Python eller Node, så finnes det nok av ressurser tilgjengelig for å få deg opp å gå på relativt kort tid. Det som kanskje har vært den mest kompliserte delen av prosessen er å gjøre applikasjonen tilgjengelig utover det å kjøre den lokalt på egen PC. Dette har tidligere ofte involvert å ha en egen server, kanskje å sette opp byggkjeder, samt å passe på at de rette nettverksportene er åpne, samtidig som du ikke eksponerer serveren din for uvelkommen trafikk.

Med fremveksten av skyleverandører har dette endret seg drastisk. Giganter som Microsoft (Azure), Amazon (AWS) og Google (Firebase/Google Cloud) har for lengst gjort seg gjeldende også i dette markedet. For privatpersoner blir basispakker ofte tilbudt gratis, og gjennom bedre og enklere brukergrensesnitt, samt flere og mer varierte tjenester, fremstår skyløsninger etter hvert som et svært forlokkende alternativ til store og støyete hjemmeservere som drar opp både strømforbruk og romtemperatur.

I denne korte bloggposten skal jeg vise hvordan man kan sette opp og deploye et RESTfullt API til skyen på en liten halvtime. Det blir kjapt og gæli, og garantert banalt for en del av dere, men forhåpentligvis åpner det noen øyne for mulighetene som finnes i skyen. Teknologier kommer litt i andre rekke her velg det som passer deg best.

Jeg har valgt å gå for en backend bestående av en Kotlin-kodebase paret med nylig sluppede Spring Boot 2. Kotlin er et pragmatisk språk som kjører på JVM, og som har tatt av i popularitet det siste året etter at Google i mai 2017 gjorde det til en såkalt first-class citizen på Android, som det første språket utenom Java. Spring er et modulbasert rammeverk for Java (og nå også Kotlin) med moduler som fasiliterer for alt fra databaseinteraksjon til sikkerhet og bygging av webapplikasjoner. Spring Boot er et verktøy på toppen av dette rammeverket som skal fasilitere for å bygge Spring-applikasjoner raskt og enkelt. Spring Boot tar i bruk såkalte uber jars, som gjør det lett å deploye applikasjonene hvor som helst, tilnærmet uavhengig av miljø. Jeg bruker Maven for avhengighetsstyring, men hvis du foretrekker f. eks. Gradle, som til og med støtter bygg-script skrevet i Kotlin, så er det ingenting i veien for å bruke det. For gøy har jeg også tatt med Swagger, et bibliotek for å dokumentere og teste APIer.

Bygge applikasjonen

For å komme raskt i gang, bruker jeg et annet nyttig verktøy fra folkene bak Spring: Initializr. Dette kan enten kjøres i nettleseren via start.spring.io, eller, som jeg liker å gjøre det, fra IntelliJ. Prosedyren er omtrent den samme, men når du bruker webløsningen må du laste ned koden og unzippe den før du kan begynne å utvikle selv.

Jeg tenker å sette opp en helt enkel applikasjon som henter, transformerer og eksponerer data fra et tredjeparts API, som er et relativt vanlig bruksmønster. APIet jeg integrerer mot er et API for å hente tilfeldig generert brukerdata, men som inneholder litt mer data enn jeg egentlig trenger. Nedenfor følger stegene jeg gikk gjennom for å sette opp prosjektet mitt.

  1. Velg File > New Project > Spring Initializr i IntelliJ.
  2. De fleste innstillingene er selvbeskrivende, og kan stå som de er for enkle eksempelprosjekter, men jeg valgte Kotlin i Language-nedtrekksmenyen (Java er default).
  3. I Dependencies-vinduet tar vi med oss Web og Reactive Web fra Web-fanen.
  4. Fullfør prosessen og åpne prosjektet i din IDE of choice. Filstrukturen ser forhåpentligvis ut som dette:

Allerede nå kan du kjøre applikasjonen, men den gjør ikke så mye spennende enda, vi må gjøre et par tilpasninger. Det første som trengs er en måte å hente data fra tredjeparts APIet vårt. Utvid DemoApplication.kt slik at den ser ut som dette:

Denne web-klienten er nå eksponert for hele applikasjonen vår, og kan brukes der den trengs for å gjøre kall mot randomuser-APIet.

Det neste som trengs er modeller for å mappe den dataen vi trenger fra randomuser til POJOs som så blir mappet tilbake til JSON før vi sender den videre til våre brukere. Kotlin har ikke den samme «én (offentlig) klasse per fil»-begrensningen som Java, så for enkelhets skyld har jeg puttet alle modellene våre i samme fil:

Til slutt må vi eksponere et endepunkt vi kan hente våre nye, lettere brukere fra. Det er flere måter å gjøre dette på, f. eks. kan man bruke Springs nye, funksjonelle router-API. Jeg har valgt å gjøre det på gamlemåten, via en mapping i en kontroller:

Her dras web-klienten vi definerte tidligere inn ved hjelp av Springs avhengighetsinjeksjon, og brukes så for å gjøre kall til randomuser-APIet. Våre brukere har også mulighet til å sende ved URL-parameteret «count» for å bestemme hvor mange testbrukere de vil ha ut (med en arbitrær maks på 30). Tro det eller ei, men nå er faktisk applikasjonen vår mer eller mindre klar til å bli deployet. Når det er sagt, så nevnte jeg tidligere at jeg hadde lyst til å dra inn Swagger, for hva er vel et API uten dokumentasjon? Swagger autogenererer en JSON-definisjon av APIet ditt, og tar du med Swagger-UI også, så får du tilgang til et sexy brukergrensesnitt i nettleseren (på /swagger-ui.html) hvor du også kan teste alle endepunktene dine. Endringene som skal til er ikke store. Vi må legge til Swagger som avhengighet, som i Maven gjøres i pom.xml på følgende måte:

Vi må også aktivere Swagger i Spring Boot, noe som krever (enda) en endring i DemoApplication.kt, slik at den blir seende ut slik:

er vi endelig klare til å deploye appen vår til skyen. Kjør mvn clean install fra terminalen din, og se at det blir generert en fil som heter demo-0.0.1-SNAPSHOT.jar i target-mappa i prosjektet ditt.

Deploye applikasjonen til skyen

Nå kommer den kule delen. Vi har en fungerende app, pakket i en JAR-fil. Som nevnt tidligere fins det flust av leverandører av skymiljøer for webapplikasjoner, jeg kommer til å gå gjennom deploy til to av dem; Amazons AWS og Heroku, en tjenesteleverandør eid av skyselskapet Salesforce.

AWS

Sørg for at du har en konto hos AWS, og har tilgang til tjenesten som heter Elastic Beanstalk. Åpne opp konsollen din, og følg stegene beskrevet under.

  1. Create New Application — Linken i øvre høyre hjørne bør være enkel å finne. Gi applikasjonen din et beskrivende navn og trykk Create.
  2. Sett opp miljø — Applikasjonen trenger et miljø å kjøre i; Create one now. Huk av for Web server environment. Select tar deg videre til konfigureringssiden. Du kan velge å gi domenet applikasjonen skal kjøre under et beskrivende navn, eller du kan la tjenesten autogenerere et (ikke fullt så beskrivende) domene for deg. Under Platform velger du Preconfigured platform og Java fra nedtrekksmenyen. Velg Upload your code under Application code, og last opp JAR-filen du bygget tidligere. Applikasjonen er nå nesten klar til å kjøre: Det siste som må gjøres er å eksponere applikasjonen på korrekt port. Elastic Beanstalk bruker nemlig en annen default (5000) enn Spring Boot (8080). Måter å gjøre dette på er via Configure more options, velg Modify under Software-boksen, og legg inn SERVER_PORT som miljøvariabel med verdi 5000, eller ved å sette server.port=5000 i application.properties før du bygger applikasjonen. Trykk Save etterfulgt av Create environment, vent et par minutter, og så skal applikasjonen være oppe og kjøre på URL-en du definerte tidligere.

Heroku

Der AWS har satset på valgmuligheter og et intuitivt brukergrensesnitt, har Heroku valgt en litt annen løsning. Utover å ha opprettet en brukerkonto må du også sørge for å ha installert Heroku CLI, et verktøy som lar deg opprette og deploye applikasjonen din via terminalen. Når du har installert verktøyet, utfører du følgende steg:

  1. heroku login etterfulgt av e-post og passord sørger for at du er autentisert mot Heroku.
  2. Naviger deg til prosjektmappen og kjør heroku create. Dette sørger for å opprette en applikasjon hos Heroku.
  3. git push heroku master fra samme mappe deployer koden din. Applikasjonen din vil bli automatisk gjenkjent som en Maven/JVM-applikasjon, og blir så bygget og kjørt opp hos Heroku. Når prosessen er ferdig kan du åpne applikasjonen din i nettleseren med heroku open.

Hvis du har fulgt alle stegene bør du nå ha et enkelt, veldokumentert API kjørende i skyen, hurra!

--

--