Översikt
Kursens sista block behandlar användningen och skapandet av API:er och då med fokus på RESTful API:er, eller kort och gott REST.
Händer i veckan
Section titled “Händer i veckan”Vi har nu alltså 3 veckor på oss att jobba med uppgiften B3 och materialet för dessa veckor skall hjälpa oss med det.
Det finns tre föreläsningar som förbereder oss för uppgiften B3 med hjälp av två exempelprogram som vi numer känner väl igen. Det handlar nu om exempelprogrammen “RESTful Tasks” som en variant av “Just Task It”.
Titta på föreläsningarna och provkör samtidigt exempelprogrammen så att du har koll på hur det fungerar.
Använd sedan kodbasen från exempelprogrammen för att bygga grunden till din B3, eller använd den koden du skrev i B2 och modifiera den.
“Stå-upp”-vloggar
Section titled ““Stå-upp”-vloggar”Tidigare års “stå-upp”-vloggar för er som vill ha en introduktion till kursveckorna.
Inspelningen inleder 1DV026:s sista kursblock, kursvecka 16-19.
Från webbapplikationer till webbtjänster
Section titled “Från webbapplikationer till webbtjänster”Kursens sista block handlar om webbtjänster i stället för webbapplikationer, en skillnad som introducerades i kursvecka 6. Blocket omfattar egentligen fem veckor, eftersom den sista veckan är examination av B3. Fokusera ändå först på att göra klart realtidsapplikationen B2, och gå vidare hit när den är inlämnad.
Webbtjänsterna utformas RESTful: URL:erna utformas på ett särskilt sätt, och HTTP-metoderna
används för det de är till för, till exempel DELETE för att ta bort, PUT för att ersätta och
PATCH för att modifiera en resurs. Hittills har kursen bara använt GET och POST, eftersom
HTML-formulär bara stöder dem. Utan vyer kan hela HTTP användas, vilket gör koden mer logisk. Det
här är en introduktion; detaljerna kommer i årskurs två.
Att skriva en webbtjänst är på sätt och vis enklare än en webbapplikation. Det finns inget användargränssnitt att ta hänsyn till, utan HTTP-protokollet och statuskoderna är gränssnittet, och i den här kursen skickas bara JSON tillbaka. I B3 skriver du ingen klient alls, utan testar tjänsterna med till exempel Postman.
Autentisering med JWT
Section titled “Autentisering med JWT”Det som blir svårare är autentisering och auktorisering, eftersom det inte längre finns något inloggningsformulär. Grundidén är densamma: användaren talar om vem den är och visar vid varje anrop att den har rätt att göra det den försöker göra, som ett passerkort. I stället för sessionscookies används JSON Web Tokens (JWT).
B3 - Picture It
Section titled “B3 - Picture It”B3 består av två tjänster du skriver själv, och en tredje som redan finns:
- Auth service hanterar användare och inloggning och har en egen databas.
- Resource service hanterar bilderna och har en egen databas.
- Image service lagrar själva bilderna och är redan driftsatt.
nginx fungerar som reverse proxy och skickar anrop till rätt tjänst beroende på sökvägen, precis som tidigare. Båda tjänsterna körs i PM2 på samma server, men skulle lika gärna kunna ligga på olika maskiner, skrivas i olika språk och använda olika databaser. Här skrivs båda i Express med MongoDB för enkelhetens skull.
Om resource-tjänsten skulle fråga auth-tjänsten vid varje anrop om användaren är inloggad skulle auth-tjänsten belastas hårt. I stället signerar auth-tjänsten en JWT med en asymmetrisk nyckel, och resource-tjänsten kan själv verifiera signaturen. Det är kanske den mest avancerade delen av uppgiften, men inte svår när man väl förstår koncepten. Exemplen “RESTful Tasks” och “RESTful Tasks with JWT” finns att utgå från.
Tips från handledningen
Section titled “Tips från handledningen”- Låt inte PM2 krascha i en loop. Kraschar applikationen, till exempel för att anslutningssträngen till databasen saknas, startar PM2 om den gång på gång och loggar varje fel. Till slut kan loggfilerna fylla disken, och då beter sig servern märkligt. Stoppa processen tills du har hittat felet.
- Se upp med typografiska citattecken. Klipper du ut och klistrar in en miljövariabel kan raka
citattecken (
") ha ersatts av böjda (”), och då fungerar den inte. Sådana fel är mycket svåra att hitta. - B2 får hårdkoda ett projekt. Realtidsapplikationen ska inte ha inloggning via GitLab (OAuth) eller låta användaren välja projekt, utan kan utgå från ett enda projekt som skickar webhooks. Det är inte realistiskt, men uppgiften handlar om att lära sig webhooks.
Andra vloggen i kursvecka 16-19. Den första delen har gästen Anna, som läser årskurs två.
SI-ledare och Datatjej
Section titled “SI-ledare och Datatjej”Anna har under hösten varit SI-ledare tillsammans med Nelly. SI-passen är en trygg punkt utan lärare, där nya studenter hjälps åt att hitta in i studierna, både med programmeringen och med annat, som att hitta studentboende. Till skillnad från handledningen behöver SI-ledaren inte kunna alla svar, utan gruppen kommer fram till dem tillsammans. Uppdraget ger lön och är värdefullt på CV:t. Målet är att det nästa läsår också ska finnas SI-pass på distans, ledda av distansstudenter. Den som är intresserad av att bli SI-ledare eller amanuens kan anmäla sig via en enkät i programmets Slack-kanal.
Anna och flera andra studenter var också på konferensen Datatjej, med föreläsningar från företag, självcoachning och en jobbmässa. Kursledningens råd är att börja hålla koll på sådana evenemang, och på LinkedIn, under årskurs två.
B3: vem får se vad?
Section titled “B3: vem får se vad?”En fråga från handledningen gäller behörigheter i B3. Som i de flesta tjänster av det här slaget har en användare bara rätt till sina egna resurser i resource-tjänsten: användaren ser bara de bilder den själv har lagt till och kan bara ändra och ta bort dem. Själva bilderna, som image-tjänsten publicerar på en URL, är däremot publika för alla som har länken.
Fokusera på att uppfylla alla krav i uppgiftens issues innan du lägger till egna funktioner. Extra funktionalitet är välkommen, men bara i mån av tid.
Tredje och sista vloggen i kursvecka 16-19, inför kursens sista vecka.
Återkoppling på realtidsapplikationen B2
Section titled “Återkoppling på realtidsapplikationen B2”Det vanliga upplägget är att klienten laddar sidan från servern, som hämtar alla issues och renderar en vy, och att klienten sedan kopplar upp en WebSocket. När GitLab skickar en webhook tar servern emot och verifierar den och skickar informationen vidare till klienterna över WebSocket-anslutningen.
- Skicka data, inte “ladda om dig”. Att via WebSocket-anslutningen bara be klienten ladda om sidan faller inom kraven, men är inte som det är tänkt. Anslutningen kan själv bära den data som behövs för att hålla klienten i synk.
- Uppdateringar från klienten. Postar klienten till exempel “stäng issue” till servern och får en omrenderad vy tillbaka, kommer GitLab också att skicka en webhook, och klienten får samma information två gånger. Fler har i år i stället skickat meddelandet över WebSocket-anslutningen till servern, en slags WebSocket-routing. Det är en godtagbar lösning. Det kan ge märkbart lång svarstid, vilket kan lösas med optimistisk uppdatering, men det är mer avancerat än vad kursen kräver.
- Återanvänd webbkomponenter. En issue är ett utmärkt exempel på något som kan vara en webbkomponent. Det är inget krav, men en inlämning fick guldstjärna för det.
B3: flera tjänster som ska hållas i synk
Section titled “B3: flera tjänster som ska hållas i synk”När klienten uppdaterar en resurs via resource-tjänsten uppdaterar den i sin tur bilden i image-tjänsten. Egentligen ska antingen hela uppdateringen gå igenom eller ingenting, vilket kräver återställningskod om något steg misslyckas. Det finns inget krav på det, så börja med att förutsätta att allt går bra, och lägg gärna en TODO i koden. Den största risken är att den externa image-tjänsten inte svarar. Uppdatera därför image-tjänsten först och den egna databasen sedan, så kan du svara med ett fel utan att behöva återställa något om det första steget misslyckas.
- Egna id:n. Använd inte image-tjänstens id som id i resource-tjänsten, utan spara det i ett eget fält. Då står det dig fritt att välja databashanterare oberoende av hur image-tjänsten lagrar sin data.
- Bara egna resurser. En användare ska bara kunna se och ändra sina egna resurser via resource-tjänsten.
- nginx-konfigurationen. De extra
proxy_set_header-raderna i guiden till servern behövdes för WebSocket-anslutningen i B2. För B3 räcker nginx-exemplen i uppgiftens issues 10 och 11.
Stödjande inspelningar
Section titled “Stödjande inspelningar”REST - Introduktion
Section titled “REST - Introduktion”GitLab-projekt - RESTful Tasks
REST - Keys, filters, limits, versions
Section titled “REST - Keys, filters, limits, versions”GitLab-projekt - RESTful Tasks
REST - Auth/Autz incl. JWT
Section titled “REST - Auth/Autz incl. JWT”GitLab-projekt - RESTful Tasks with JWT
Läsanvisningar
Section titled “Läsanvisningar”Under läsanvisningar hittar du veckornas kapitel som ska läsas i kurslitteraturen. Planera upp och dela upp läsningen under veckorna.
Handledning
Section titled “Handledning”Skicka gärna in frågor på förhand via vårt formulär som du når här:
Inlämning, B2 - Realtime Web Application
Section titled “Inlämning, B2 - Realtime Web Application”Dessa veckor är det deadline för examinationsuppgift B2.
Arbete, B3 - Picture It
Section titled “Arbete, B3 - Picture It”När uppgift B2 är avklarad är det dags att sätta igång och arbeta med kursens sista examinationsuppgift, B3. Denna uppgift redovisas muntligt kursens sista vecka.
Studiefrågor
Section titled “Studiefrågor”Här är ett antal frågor som du kan försöka besvara och diskutera tillsammans med din Ai-kompis. Tveka inte att lyfta någon av frågorna till handledningen för att fortsätta diskussionen med lärare och studiekamrater.
Frågor att diskutera med din Ai-kompis
- Vad innebär ett RESTful API (i Node/Express)?
- Är REST ett vanligt sätt att bygga webbtjänster?
- Vad innebär JWT i sammanhanget REST?
- Är JWT en standard som används ofta eller finns det alternativ?
- Förklara skillnaden mellan symmetriska nycklar och asymmetriska nycklar, i sammanhanget där man skapar ett JWT token.
Här är en utskrift från hur det såg ut när jag diskuterade ovan frågor med min Ai-kompis Ajj.
Här följer tips till hur du kan prioritera bland kursmaterialet för att komma igång med veckan.
- Börja att snabbt läsa igenom vad B3 handlar om, för att få en översikt och bakgrund.
- Titta igenom de föreläsningar som finns, börja med en snabb överblick av alla tre.
- Försäkra dig om att du kan starta exempelkoden för de båda exemplen med “RESTful Tasks…”. Analysera koden.
- Välj ett exempelprogram att utgå ifrån för att börja snickra på din B3.