api-spec/play/api.md

4.4 KiB

Senaste föreläsningar från Play

Versionshantering

Alla API:er skall versioneras med hjälp av URI:n. Den första versionen skall vara v1. Inga bakåtbrytande ändringar får göras i en version, istället skall en ny version skapas.

När en ny version skapas skall den gamla versionen finnas kvar i minst någon tid för att tillåta migrering. Alla endpoints ska finnas i alla versioner även om dom inte har ändrats.

Exempel på ändringar som tillåts inom en version

  • Lägga till nya fält i ett svar
  • Lägga till nya API:er
  • Lägga till nya feltyper

Säkerhet/autentisering

API:t skall använda sig av OAuth 2.0 med JSON Web Tokens (JWT) i JSON Web Signature (JWS) format för autentisering och avgöra behörigheter på principalen (sub) som identifieras av token och eventuella entitlements.

För mer information se https://oauth2.dsv.su.se/

Prestandakrav

99% av alla giltiga förfrågningar måste svaras på inom 100ms. Detta måste gälla hela tiden genom att mäta i ett kort rullande fönster, inte bara genomsnittligt över en längre period.

Internationalisering

Om en lokal eller annan data har namn (eller annat attribut) på flera språk skall värdet baseras på HTTP headern Accept-Language och språket ska anges i svaret med hjälp av Content-Language om inget av språken i Accept-Language finns skall det falla tillbaka på engelska.

Denna internationalisering måste även appliceras på felmeddelanden; title, detail, och eventuella extra attribut.

Exempel med språk som inte stöds

> GET /lokal
> Accept-Language: de
< 200 OK
< Content-Language: en
{
  "name": "Meeting room"
}

Exempel med språk som stöds

> GET /lokal
> Accept-Language: sv
< 200 OK
< Content-Language: sv
{
  "name": "Mötesrum"
}

Felhantering

Fel anges i RFC 7807 format (Problem details)

Alla olika feltyper (type attribut) skall dokumenteras

Exempel på generella fel som kan förekomma i alla anrop

Ej behörig

< 403 Forbidden
< Content-Type: application/problem+json
{
  "type": "daisy:forbidden",
  "title": "You can not perform this action",
  "detail": "You may not book a group room because you are not a student at SU",
  "instance": "/v1/bookings/group-rooms"
}

Felaktigt format på datum/tid

< 400 Bad request
< Content-Type: application/problem+json
{
  "type": "daisy:bad-request",
  "title": "Bad request",
  "detail": "Badly formatted request",
  "instance": "/v1/bookings/group-rooms",
  "violations": {
    "start_time": "Must be in format YYYY-MM-DDTHH:MM",
    "name": "Too long, max 100 characters"
  }
}

Hämta senaste föreläsningar

> GET /v1/lectures/recent?course=INPRG&course=MDI2&course=DAI1
> Accept: application/json
> Accept-Language: sv
> Authorization: Bearer <oauth 2 token>
< Content-Type: application/json
< Content-Language: sv
[
  {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "title": "Introduktion till programmering",
    "description": "En grundläggande kurs i programmering med Python.",
    "duration": "PT2H04M",
    "created_at": "2024-06-01T10:00:00Z",
    "thumbnail_url": "https://example.com/thumbnails/intro-to-programming.png",
    "course": {
      "name": "Introduktion till programmering",
      "short_name": "INPRG",
      "semester": "VT2022"
    },
  },
  ...
]

Hämta föreläsningar på en kurs

> GET /v1/lectures?course=INPRG&semester=HT2001
> Accept: application/json
> Accept-Language: en
> Authorization: Bearer <oauth 2 token>
< 200 OK
< Content-Type: application/json
< Content-Language: en
[
  {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "title": "Introduction to Programming",
    "description": "A basic course in programming with Python.",
    "duration": "PT2H04M",
    "created_at": "2024-06-01T10:00:00Z",
    "thumbnail_url": "https://example.com/thumbnails/intro-to-programming.png",
    "course": {
      "name": "Introduction to Programming",
      "short_name": "INPRG",
      "semester": "VT2022"
    },
  },
  ...
]