Minimális Elixir JSON RESTful API

Hogyan tegyünk ki egy JSON végpontot az Elixirben mindenféle keret nélkül?

Egy új nyelvet fáj

Sok Elixir fejlesztő érkezik a Ruby világból. Nagyon érett környezet amikor a rendelkezésre álló közösségi könyvtárakról és keretrendszerekről van szó. És ezt néha hiányolom az Elixirből. Amikor harmadik fél szolgáltatását szeretném integrálni, az eredmény a következő lehet:

json

  1. van egy hivatalos, jól támogatott könyvtár (nagyon ritka)
  2. van egy hivatalos, de elavult vagy hibás könyvtár (néha előfordul)
  3. van egy jól támogatott közösségi könyvtár (néha-néha)
  4. van egy közösségi könyvtár, de már nincs karbantartva (nagyon gyakori)
  5. több könyvtár létezik, mindegyik a szerzőjük igényeinek megfelelően íródott és hiányzó funkciókkal (a legnépszerűbb)
  6. van egy saját könyvtáram, amely a fentiek legjobbjait ötvözi ... (túl gyakran)

Egyszerű JSON API az Elixirben

Lehet, hogy meglepődsz, de Ruby nem mindig áll a Rails-en. Ennek sem kell kapcsolódnia a webhez. Bár ebben a konkrét esetben beszéljünk pontosan a webről.

Amikor egyetlen RESTful végpontot kell kitenni, általában rengeteg választási lehetőségünk van:

Ezek csak azok a példák, amelyeket személyesen használtam. Kollégáim boldog Sinatra felhasználók, és már korábban is kipróbálták a Hanamit. Bármit válogathatok, amire szükségem van és ami tetszik, még a jelenlegi hangulatomtól is függően.

Amikor azonban átálltam az Elixirre, kiderült, hogy a választási lehetőségek korlátozottak. Annak ellenére, hogy van néhány alternatív „keretrendszer” (amelyet nyilvánvaló okokból itt nem említek), szinte használhatatlanok!

Az egész napot az interneten valaha említett könyvtárakkal töltöttem. Megpróbáltam telepíteni egy egyszerű HTTP2 szervert Heroku-ra a Slack bot szerepét töltötte be, de a nap végén megadtam magam. Szó szerint semmi, amit találtam, nem tudta kielégíteni az alapvető követelményeket.

A Phoenix nem mindig a megoldás

A P hoenix a kedvenc webes keretrendszerem, valaha is csak nincs rá szükségem. Haboztam használni, mert szerettem volna elkerülni, hogy a teljes keretrendszert csak egyetlen végponthoz húzzam, bármennyire is könnyű lenne.

Könyvtárat sem tudtam használni, mert mint említettem, semmi, amit találtam, nem felelt meg az igényeimnek (vagyis az alapvető útválasztás JSON kezeléssel), és elég kényelmes volt a Heroku egyszerű és gyors telepítéséhez. „Menjünk egy lépést hátra” - gondoltam.

Figyelem, maga a Főnix valami tetejére épül, nem igaz?

Plug & Cowboy a mentéshez

Ha valóban minimális Ruby szervert akarunk megvalósítani, akkor csak a rack-et használjuk, amely egy moduláris Ruby webszerver felület.

Szerencsére az Elixirben használhatunk hasonlót. Itt a következő elemeket fogjuk felhasználni:

  • cowboy - egy kicsi és gyors HTTP szerver az Erlang/OTP számára, amely teljes HTTP verem és útválasztási lehetőségeket kínál, optimalizálva az alacsony késleltetés és az alacsony memóriahasználat érdekében
  • Dugaszolható csatlakozók a különböző webkiszolgálókhoz az Erlang virtuális gépben, és a kapcsolat közvetlen interfész az alapul szolgáló webszerverhez
  • méreg - csak egy JSON könyvtár az Elixir számára

Olyan összetevőket szeretnék megvalósítani, mint az Endpoint, a Router és a JSON Parser. Ezután szeretném ezt telepíteni a Heroku-ra, és képes lennék kezelni a beérkező kéréseket a kitett végpontra. Megnéztem, hogyan lehet elérni.

Alkalmazás

Győződjön meg róla, hogy az Elixir projektje a felügyelt. Ennek megszerzéséhez a következőképpen kell létrehoznia:

Győződjön meg a következő bejegyzésről a mix.exs fájlban:

és hozza létre a lib/minimal_server/application.ex fájlt:

Könyvtárak

A mix.exs fájlunkban a következő könyvtárakat kell meghúznia:

Ezután állítsa össze őket:

Végpont

Készen állunk arra, hogy létrehozzunk egy belépési pontot a szerverére. Készítsünk akkor lib/minimal_server/endoint.ex fájlt:

A Plug biztosítja a Plug.Router programot a bejövő kérések elküldéséhez az útvonal és a módszer alapján. Az útválasztó meghívásakor meghívja a: match plug-et, amelyet egy match/2 függvény képvisel, amely felelős az egyező útvonal megtalálásáért, majd továbbítja azt a: dispatch plug-be, amely végrehajtja az egyező kódot.

Mivel azt akarjuk, hogy az API JSON-kompatibilis legyen, itt a Plug.Parsers programot valósítjuk meg. A kérelem törzsének elemzésére fogjuk használni, mert az alkalmazás/json kéréseket a következővel kezeli: json_decoder .

Végül létrehoztunk egy ideiglenes „összes befogható útvonalat”, amely megfelel az összes kérelemnek, és a HTTP nem található (404) állapotkóddal válaszol.

Router

Az útválasztó az alkalmazásunk utolsó lépése. Ez az egész része, amelyet létrehoztunk: a webböngésző kérésétől a válaszmegjelenítésig.

Kezeljük a kliens bejövő hívását, és ott kódolunk néhány üzenetet:

A fenti útválasztónkban a kérés csak akkor fog egyezni, ha GET módszer és az útvonal /. A router az "application/json" tartalom típusával és törzsével válaszol:

Összekötve őket

Itt az ideje, hogy kiterjesszük az Endpoint-t, hogy továbbítsuk a kéréseket az útválasztóhoz, és kiterjesszük az Alkalmazásunkat, hogy maga az Endpoint is létrejöjjön.

Az első dolog, amit tehetünk hozzáadással

sor a MinimalServer.Endpoint modulhoz. Ez biztosítja, hogy a/bot minden kérését továbbítsuk és az útválasztónk kezelje .

A második dolog elvégezhető az endpoint.ex kiterjesztésével a child_spec/1 és a start_link/1 függvényekkel:

Most módosíthatja az application.ex fájlt a MinimalServer.Endpoint hozzáadásával a gyermekek által visszaküldött listához/0 .

A szerver indításához elég végrehajtani: