HTTP methods z Go i MongoDB – część 3 – PUT i DELETE

HTTP methods

W poprzednich dwóch częściach cyklu nauczyliśmy się tworzyć produkty, pobierać listę produktów oraz pojedynczy produkt za pomocą ID. Poniższy wpis zademonstruje, w jaki sposób możemy zaaktualizować produkt oraz jak go usunąć, czyli poznamy metody PUT i DELETE.

HTTP methods – PUT

Aktualizacja produktu

Do aktualizacji produktu wykorzystamy wiedzę, którą zdobyliśmy do tej pory – czyli pobieranie produktu po ID.

Na początek wykorzystamy pakiet gorilla/mux, aby dostać się parametrów zapytania. Następnie sprawdzamy czy wsród parametrów znajduje się ID. Jeżeli wszystko przebiegło poprawnie, to konwertujemy ID na ObjectIdHex.

W kolejnym kroku, podobnie jak przy metodzie POST, tworzymy nasz lokalny produkt, parsujemy i dekodujemy. Otwieramy połączenie z bazą danych i dzięki metodzie UpdateId, aktualizujemy nasz produkt przesyłając kolejno oid i product.

Na koniec standardowe ustawienie nagłówków: "Content-Type", "application/json", odpowiedź 200 - OK. Zamykamy sesję i zwracamy nasz zmodyfikowany produkt w formacie JSON.

Efekt pracy w POSTMANie:

Postman - PUT method- HTTP

HTTP methods – DELETE

Usuwanie produktu

Usuwanie produktów, na podstawie naszych doświadczeń, wydaje się teraz dziecinnie proste.

Metoda remove(), nie różni się niczym znaczącym od wcześniej wspomnianych metod. Całą magię wykonuje RemoveId(), gdzie jako parametr przekazujemy ObjectIdHex. Efekt naszej pracy na screenie poniżej:

Postman - DELETE method- HTTP

Podsumowanie

Powyższy wpis, to trzecia i ostatnia część cyklu HTTP methods. Praca nad tymi kilkoma endpointami dała mi wiele satysfakcji. Zdaję sobie sprawę z tego, że wymagają one poprawy. Poszedłem na duże uproszczenia, ale ucząc się języka Go oraz MongoDB, postawiłem sobie na razie za cel: minimalną, działającą funkcjonalność. To będzie dobry wstęp do czegoś większego.

HTTP methods z Go i MongoDB – część 2 – GET

HTTP methods

Dobrze zaplanowana praca, to podstawa. W poprzedniej części HTTP methods, nauczyliśmy się tworzyć produkty, za pomocą metody POST. W tym wpisie czas na pobieranie listy produktów oraz pojedynczego produktu po ID.

Dzięki tym trzem endpointom będziemy mogli skutecznie i efektywnie rozpocząć pracę nad front-endem naszej aplikacji.

HTTP methods – GET

Do pobierania elementów z bazy MongoDB użyjemy pakietów net/http, gorilla/mux oraz mgo.v2/bson. Do przetworzenia i wyświetlenia danych przydadzą się nam dodatkowo pakiety encoding/json oraz fmt.

Pobieranie listy produktów – getAll()

Zacznijmy od pobierania listy produktów. Metoda getAll(), którą za chwilę stworzymy, umożliwi nam wyświetlenie listy wszystkich produktów. Nie skupiam się na paginacji, filtrowaniu czy sortowaniu. Podobnie jak w poprzednim wpisie, na razie, interesuje mnie minimalna funkcjonalność.

Analogicznie, jak w poprzednim wpisie, na początku, tworzymy metodę getAll(), która jako parametry przyjmuje http.ResponseWriter oraz *http.Request. Po czym, na bazie struktury Products tworzymy lokalną zmienną o tej samej nazwie.

Całą “magię” załatwia za nas odpowiednie zapytanie do bazy danych: server.GetSession().DB("shopping-manager").C("products").Find(nil).All(&products)

Korzystamy ze stworzonego wcześniej lokalnego pakietu server i metody GetSession. Całość bazuje na pakiecie mgo.v2.  Po otwarciu sesji, wybraniu bazy danych oraz kolekcji, używamy metod Find i All, by wylistować wszystkie elementy z kolekcji.

Dodajemy jeszcze warunek, że jeżeli niczego nie znajdziemy, to endpoint odpowie nam statusem 404 - NOT FOUND. W przeciwnym wypadku standardowa odpowiedź czyli 200 - OK wraz z nagłówkiem "Content-Type", "application/json".

Na koniec zaprezentujmy wynik naszej pracy w formacie JSON, w czym pomoże nam metoda Marshal z pakietu encoding/json. Pamiętajmy o użyciu blank identifier.

Prezentacja odpowiedzi w Postmanie:

Postman - GET method- HTTP

Pobieranie produktu po ID – get()

Pobieranie produktu po ID, jest analogiczne jak powyższy przykład.

Potrzebujemy dodatkowo pobrać odpowiedni ID. Z pomocą przyjdzie nam, znana już paczka, gorilla/mux. Za pomocą metody Var, jesteśmy w stanie stworzyć obiekt params. Następnie zwracamy ObjectId w postaci hexa.

Przygotowana przez nas zmienna oid, pozwoli nam na przeszukanie kolekcji za jej pomocą. Zakładając, że ID w bazie są unikalne używamy metody Find, gdzie jako parametr przekazujemy oid, następnie wyciągamy znaleziony produkt.

Warto przy tej okazji pokazać jak zbudowany jest nasz endpoint: server.Router.HandleFunc("/product/{id}", get).Methods("GET").

Na koniec, standardowo, odpowiedź z Postmana:

Postman - GET by ID method- HTTP

Podsumowanie

Po pierwszych dwóch tygodniach pracy z językiem Go jestem bardzo zadowolony z jej efektów. Pisanie w tym języku jest bardzo szybkie i efektywne. W miarę poznawania kolejnych pakietów, odkrywając strukturę języka i poznając dobre praktyki mam wrażenie, że język ten został napisany specjalnie dla mnie. Tym nieskromnym stwierdzeniem zamykam, na tydzień, pracę nad backendem mojej konkursowej aplikacji Shopping Manager.

HTTP methods z Go i MongoDB – część 1 – POST

HTTP methods

W poprzednich dwóch częściach było małe co nieco o języku GO oraz MongoDB. Czas scalić te dwie odrębne do tej pory funkcjonalności za pomocą HTTP methods. Czas na poznanie pierwszej z nich, czyli metody  POST.

HTTP methods – POST

Stworzenie endpointu w Go, dzięki któremu będziemy mogli zapisać nasze produkty do bazy danych MongoDB można podzielić na cztery etapy: tworzenie obiektu, przygotowanie obiektu, otworzenie połączenia z bazą danych oraz zapis do bazy. Poniżej przedstawiam całą metodę create(). Na razie nie skupiam się nad optymalizacją czy walidacją.  Chcę po prostu, aby metoda robiła dokładnie to co sobie założyłem, czyli żeby działała.

Opis działania

Z pomocą pakietu net/http tworzymy metodę create, która jako parametry otrzymuje http.ResponseWriter i *http.Request. Następnie, na podstawie stuktury Product, tworzymy lokalny byt o tej samej nazwie.

Dzięki pakietowi encoding/json mamy możliwość stworzenie dekodera i zdekodowanie naszego produktu, poprzez przekazanie adresu naszego produktu. Z kolei biblioteka gopkg.in/mgo.v2/bson, pozwala nam stworzyć unikalny klucz ID, który dołączamy do produktu.

Sesję z bazą danych otwieramy poprzez wcześniej przygotowaną metodę GetSession z lokalnego pakietu service. Wybieramy bazę i kolekcję i dodajemy produkt.

Pamiętajmy o nagłówkach responseWriter.Header().Set("Content-Type", "application/json") oraz o odpowiedzi responseWriter.WriteHeader(201). Teraz możemy zenkodować obiekt i przygotować do wyświetlenia. Przy tworzeniu obiektu wykorzystamy blank identifier. Do wysłania danych wykorzystamy znany już pakiet fmt, a właściwie metodę Fprintf.

Podsumowanie

Endpoint działa poprawnie, co prezentuje screen z Postmana zamieszczony poniżej. Jak wspominałem wcześniej brakuje walidacji, brakuje również testów. Zależało mi tylko na napisaniu działającej metody, która skomunikuje moje api z bazą danych. Na usprawnienia i refaktoryzację przyjdzie czas później.

Postman - POST method- HTTP