Ibland hamnar man i den obekväma situationen att tvingas gå utanför CRUD ramarna i sin API design. Enkelt beskrivet har man ett behov som inte handlar om att skapa eller uppdatera ett attribut inom resursen. I vårt exempel med flygplan har vi tex följande URI:er för att hämta/skapa/uppdatera en resurs:
- POST https://api.topapi.se/api/airplanes/
- GET https://api.topapi.se/api/airplanes/{airplaneId}
- PUT https://api.topapi.se/api/airplanes/{airplaneId}
Men vad gör vi för att tex starta flygplanet om nu detta inte motsvarar ett attribut i resursen ”airplane”? Tex att starta mitt flygplan och skicka det till himlen. Här behövs någonting annat än vanliga CRUD operationen. Är det helt fel enligt REST guidelines?
”If you finish the demanding, yet satisfying task of reading Roy Fielding’s PhD thesis, which defines the REST architectural style, you will see that it says nothing about limiting our REST services to CRUD operations and it also says nothing about limiting ourselves to the collection pattern…”
Mitt tips är att använda det man kallar för ”controller pattern” där man använder ett verb som beskriver operationen. Ett URI exempel för vårt flygplan som ska skickas iväg blir då:
- PUT https://api.topapi.se/api/airplanes/{airplaneId}/launchAirplane
Här uppdaterar vi inte resursen utan ”triggar” istället en aktivitet för densamma. Exemplet visar inte vilka parametrar som ev behöver skickas med i operation.
Ett bra alternativ till att sätta kontroll verbet i URIn nedan. Här gör man det tydligt att det inte är en resurs i URIn som modifieras.
- PUT https://api.topapi.se/api/airplanes/{airplaneId}?action=launchAirplane
- PUT https://api.topapi.se/api/airplanes/{airplaneId}?launchAirplane=true