• RESTful
  • REST
  • RPC
  • API
  • arkkitehtuuri
  • API-suunnittelu

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.

Yijun
Yijun
Developer

Lopeta viikkojen tuhlaaminen käyttäjien tunnistautumiseen
Julkaise turvallisia sovelluksia nopeammin Logtolla. Integroi käyttäjien tunnistautuminen minuuteissa ja keskity ydintuotteeseesi.
Aloita
Product screenshot

Ä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:

  1. Suunnittelun yksinkertaistaminen: Yksi menetelmä voi hoitaa kaiken
  2. Turvallisuus: POST-parametrit eivät näy URL-osoitteessa
  3. 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:

  1. 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
  2. Johdonmukainen: Noudata tiettyjä määrittelyjä oppimiskustannusten vähentämiseksi
  3. Laajennettavissa: Kyetä helposti suorittamaan versionhallintaa ja toiminnallista laajennusta
  4. 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:

  1. Hanki kaikki artikkelit:

  2. Hanki tietty artikkeli:

  3. Luo uusi artikkeli:

  4. Päivitä artikkeli:

  5. 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:

  1. Palvelun määrittely luetteloi selkeästi kaikki saatavilla olevat toiminnot (tässä yksinkertaistetussa esimerkissä GetArticle ja CreateArticle).
  2. Jokaisella toiminnolla on selkeästi määritellyt pyyntö- ja vastaustyypit.
  3. Asiakaskoodi näyttää paikallisen asynkronisen funktion kutsumiselta, käyttäen await odottamaan tulosta, mikä edelleen piilottaa verkkoviestinnän monimutkaisuuden.
  4. 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:

  1. 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
  2. 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ä

  1. API-suunnittelun ydin on selkeys, johdonmukaisuus, laajennettavuus, ja tehokkuus, ei tietyn menetelmän tai tyylin noudattamisessa.
  2. Sekä RESTful että RPC ovat kypsiä API-suunnittelutapoja. Valinta niiden välillä tulisi tehdä projekti vaatimusten perusteella, ei henkilökohtaisen mieltymyksen perusteella.
  3. 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.
  4. Älä anna pinnallisten teknisten yksityiskohtien häiritä. Tärkeintä on se, pystyykö API:si tehokkaasti palvelemaan käyttäjiäsi ja liiketoimintatarpeitasi.
  5. 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.