Vain POST? Lopetetaan tämä absurdi API-suunnittelukeskustelu
Kumotaan "vain POST" API-myytti, selitetään miksi se johtuu API-suunnitteluperiaatteiden väärinkäsityksestä ja selvennetään RESTful- ja RPC-arkkitehtuurityylien asianmukaiset käyttökohteet.
Äskettäin kiinnitin huomiota keskusteluun siitä, pitäisikö API:t suunnitella käyttämällä vain "POST". Tutkittuani tätä väittelyä huomasin, että ei vain ole merkityksetöntä, mistä ihmiset kiistelevät, vaan se myös paljastaa monien kehittäjien väärinymmärryksen API-suunnittelun olemuksesta. Tänään syvennymme API-suunnittelun ydinajatuksiin ja näemme, miksi tätä väittelyä ei pitäisi olla olemassa ensinkään.
"Vain POST" väärinkäsitys
Kehittäjät, jotka puolustavat "vain POST" -käyttöä korvatakseen RESTful API -määrittelyt, eivät selvästikään ole ymmärtäneet API-suunnittelun tärkeintä kohtaa. Heidän väitteensä sisältävät tavallisesti:
- Suunnittelun yksinkertaistaminen: Yksi menetelmä voi hoitaa kaiken
- Turvallisuus: POST-parametrit eivät näy URL-osoitteessa
- Joustavuus: POST voi lähettää minkä tahansa tietorakenteen
Pintapuolisesti nämä argumentit vaikuttavat järkeviltä. Mutta todellisuudessa tämä näkökanta sekoittaa HTTP-menetelmien valinnan API-suunnittelutyyleihin, jotka ovat kaksi eri tasoista ongelmaa. POST on vain yksi HTTP-protokollan menetelmä, kun taas REST on API-suunnittelutyyli.
API-suunnittelun olemus
Ennen kuin keskustelemme tietyistä API-tyyleistä, meidän on ymmärrettävä, mikä API-suunnittelun ytimenä on. Hyvä API:n tulisi olla:
- Selkeä ja ymmärrettävä: Muiden kehittäjien (sisältäen tulevan itsesi) pitäisi pystyä intuitiivisesti ymmärtämään jokaisen päätepisteen tarkoitus
- Johdonmukainen: Noudata tiettyjä määrittelyjä oppimiskustannusten vähentämiseksi
- Laajennettavissa: Kyetä helposti suorittamaan versionhallintaa ja toiminnallista laajennusta
- Tehokas: Harkitse tehokkuutta suorituskyvyn ja resurssien käytön kannalta
RESTful API: Enemmän kuin vain HTTP-menetelmien valinta
RESTful API on vain yksi monista API-suunnittelutyyleistä, joka keskittyy resursseihin ja resurssien toimintoihin. Otetaanpa yksinkertainen blogijärjestelmä esimerkiksi nähdäksesi, miten RESTful API suunnitellaan:
-
Hanki kaikki artikkelit:
-
Hanki tietty artikkeli:
-
Luo uusi artikkeli:
-
Päivitä artikkeli:
-
Poista artikkeli:
Tässä esimerkissä näemme:
- API on suunniteltu "artikkeli"-resurssin ympärille
- Eri HTTP-menetelmiä käytetään kuvaamaan eri toimintoja
- URL-rakenne on selkeä, osoittaa resurssin, jota operoidaan
Tämä suunnittelutapa tekee API:sta intuitiivisemman ja itseään selittävämmän, mikä helpottaa kehittäjiä ymmärtämään jokaisen päätepisteen toiminnan.
RPC: "Vain POST" -tyylin takana oleva API-tyylin ymmärtäminen
RPC (Remote Procedure Call) -tyylisen API-suunnittelun tavoitteena on tehdä etäpalvelukutsuista näyttämään yht ä yksinkertaisilta kuin paikallisten funktioiden kutsuminen.
Mielenkiintoista on, että ne, jotka puolustavat "vain POST" -käyttöä, eivät ehkä ymmärrä, että he itse asiassa kuvaavat RPC-tyyliä.
Verrattuna RESTful API:ihin, RPC keskittyy enemmän itse operaatioon kuin resurssiin. Tästä syystä RPC-tyyliset API:t käyttävät yleensä "verbi + substantiivi" -muotoa, kuten getProduct(productId)
tai createUser(userData)
.
Monissa RPC-toteutuksissa kaikki operaatiot lähetetään tavallisesti POST-pyyntöinä samaan päätepisteeseen, jossa tietty toimenpide ja parametrit määritellään pyyntökehossa. Tämä on syy, miksi ajatus "vain POST" on itse asiassa lähempänä RPC: tä kuin REST.
Esimerkiksi RPC-tyylinen "hanki tuote" -pyyntö, joka perustuu HTTP:hen, saattaa näyttää tältä:
Modernit RPC-kehykset, kuten gRPC, tarjoavat tehokkaampia ja tehokkaampia toteutuksia. Käytetään tätä esimerkkiä osoittamaan RPC-tyyliä:
Ensin määritämme palvelun ja viestin muodon (käyttäen Protocol Buffers):
Sitten tämän palvelun käyttäminen Node.js-asiakkaassa on yhtä helppoa kuin paikallisen funktion kutsuminen:
Tässä RPC-tyylisessä esimerkissä näemme:
- Palvelun määrittely luetteloi selkeästi kaikki saatavilla olevat toiminnot (tässä yksinkertaistetussa esimerkissä
GetArticle
jaCreateArticle
). - Jokaisella toiminnolla on selkeästi määritellyt pyyntö- ja vastaustyypit.
- Asiakaskoodi näyttää paikallisen asynkronisen funktion kutsumiselta, käyttäen
await
odottamaan tulosta, mikä edelleen piilottaa verkkoviestinnän monimutkaisuuden. - Ei tarvitse manuaalisesti rakentaa HTTP-pyyntöjä tai jäsentää JSON-vastauksia.
Vaikka alakerros voi silti käyttää HTTP/2:ta kuljetusprotokollana, RPC-kehykset (kuten gRPC) tarjoavat kehittäjille abstraktiotason, joka saa etäkutsut näyttämään ja tuntumaan paikallisten toimintokutsuilta.
Siksi voimme nähdä, että suurin osa "vain POST" ja RESTful API -väittelyistä pitäisi olennaisesti olla keskusteluja näistä kahdesta API-tyylistä: REST ja RPC. Kuitenkin avain on tunnistaa, että molemmilla tyyleillä on omat soveltamisalueensa ja valinnan tulisi perustua projektin erityistarpeisiin, ei henkilökohtaisiin mieltymyksiin.
REST vs RPC: Ei ole absoluuttista paremmuutta tai huonommuutta
Nyt kun ymmärrämme erot REST:n ja RPC:n välillä, katsotaanpa niiden soveltuvia skenaarioita:
- REST sopii:
- Resurssiorientoituneisiin sovelluksiin (kuten sisällönhallintajärjestelmät, blogialustat, verkkokauppasivustot)
- Skenaarioihin, jotka edellyttävät hyvää välimuistitukea (GET-pyynnöt ovat luonnostaan välimuistoitavia)
- Projekteihin, jotka haluavat hyödyntää HTTP-semantikkaa (kuten käyttämällä sopivia tilakoodeja)
- Julkisille API:eille, jotka vaativat hyvää näkyvyyttä ja itsensä kuvaavuutta
- RPC sopii:
- Toimintoorientoituneisiin sovelluksiin (kuten monimutkaiset tietojenkäsittelytoiminnot, työnkulun hallinta)
- Järjestelmiin, jotka edellyttävät korkeaa suorituskykyä ja matalaa viivettä (kuten reaaliaikaiset kaupankäyntijärjestelmät)
- Sisäisten mikropalvelujen välillä tapahtuvaan viestintään (joka voi vaatia joustavampaa parametrien välittämistä)
- Kun toimintoja ei voida yksinkertaisesti kartoittaa CRUD (Luo, Lue, Päivitä, Poista) -toiminnoiksi
Tyylivalinnan tulisi perustua omiin erityistarpeisiisi. Joissain tapauksissa saatat käyttää jopa yhdistelmää näistä kahdesta tyylistä samassa järjestelmässä vastaamaan eri osien tarpeisiin.
Päätelmä
- API-suunnittelun ydin on selkeys, johdonmukaisuus, laajennettavuus, ja tehokkuus, ei tietyn menetelmän tai tyylin noudattamisessa.
- Sekä RESTful että RPC ovat kypsiä API-suunnittelutapoja. Valinta niiden välillä tulisi tehdä projekti vaatimusten perusteella, ei henkilökohtaisen mieltymyksen perusteella.
- Jos päätät käyttää "vain POST" niin suunnittele API:si RPC-tyylin mukaan. Kuten RESTful, se on yleisesti käytetty API-määrittely teollisuudessa, mutta sitä tulee käyttää sopivissa tilanteissa.
- Älä anna pinnallisten teknisten yksityiskohtien häiritä. Tärkeintä on se, pystyykö API:si tehokkaasti palvelemaan käyttäjiäsi ja liiketoimintatarpeitasi.
- Kun suunnittelet API:a, käytä enemmän aikaa resurssimallisi, liiketoimintalogiikkasi ja käyttäjäsi tarpeiden miettimiseen, äläkä murehdi, mitä HTTP-menetelmää käyttää.
Siirretään huomiomme pois näistä turhista väittelyistä ja keskitytään suunnittelemaan todella erinomaisia API:a. Loppujen lopuksi teknologia on tarkoitettu ongelmien ratkaisemiseen, ei niiden luomiseen.