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

MongoDB i mgo – czyli kilka słów o bazie danych dla języka Go

MongoDB

Podczas projektowania aplikacji internetowych, ważny jest dobór narzędzi – powinny być dostosowane do potrzeb. Nie ma sensu wprowadzać do projektu niczego na wyrost, czegoś co ma lepsze zastosowanie w innego typu projektach. Wyjątkiem od tej reguły są aplikacje tworzone dla zabicia rutyny lub szkoleniowe. MongoDB jest właśnie takim narzędziem. Gdyby nie konkurs Daj Się Poznać, w którym obecnie biorę udział, pewnie jeszcze długo nie znalazł bym czasu by przetestować go w praktyce.

Instalacja, uruchomienie MongoDB

Zainstalowanie i uruchomienie MongoDB jest bardzo proste. Przez wszystkie kroki instalacji prowadzi nas przejrzysty tutorial. Po zakończonej instalacji (w zależności od OS) wpisujemy komendę do uruchomienia usługi mongod. Jeżeli wszystko pójdzie gładko, naszym oczom powinien ukazać się komunikat podobny do tego: 2017-03-09T18:34:05.500+0100 I NETWORK [thread1] waiting for connections on port 27017.

Nasza baza jest uruchomiona i czeka na połączenie z nią. Do testu wykorzystamy drugą konsolę. Komenda mongo otworzy na shella bazy danych, natomiast sama baza zakomunikuje o połączeniu do niej: 2017-03-09T18:37:42.001+0100 I NETWORK [thread1] connection accepted from 127.0.0.1:52151 #1 (1 connection now open)

mgo – połączenie

W łączeniu się z bazą danych oraz w wykonywaniu operacji na niej pomoże mi biblioteka mgo w wersji 2. Z zainstalowaniem pakietu przez komendę go get gopkg.in/mgo.v2 miałem lekkie perturbacje, dlatego by nie tracić zbytnio czasu na rozwiązywaniem tego problemu, pociągnąłem wersję bezpośrednio z repozytorium na githubie.

Wyzwaniem była reorganizacja kodu. Metoda do połączenia z bazą trafiła póki co do pliku server.go.

Nie ma tutaj żadnych haczyków, korzystamy z biblioteki mgo, by stworzyć sesję z naszą lokalną bazą danych. W między czasie została dopisana metoda do tworzenia produktu (o tym będzie w osobnym wpisie), więc test w konsoli zakończył się powodzeniem:

$ curl -XPOST -H 'Content-Type: application/json' -d '{"name": "Szynka z 9 marca"}' http://localhost:8001/product

Wynik:

{"id":"58c19cc71c4e63572e45e3f4","name":"Szynka z 9 marca"}

I jeszcze z basha dla komenty db.products.find():

{ "_id" : ObjectId("58c19cc71c4e63572e45e3f4"), "name" : "Szynka z 9 marca" }

Go Programming Language – startujemy!

Go programming language

Każdy projekt opiera się na jakiś filarach. Dlatego na samym początku przedstawię wam język Go, który wybrałem do tworzenia backendu mojej aplikacji Shopping Manager.

Ogólny zarys języka Go

Go (nazywany też Golang) to język napisany przez pracowników Google. Pierwsza wersja języka została opublikowana w listopadzie 2009 roku. Podczas projektowania architekci wyraźnie nawiązali do tradycji języka C, starając się przy tym urzeczywistnić wizję, by język był prosty w nauce, szybki i elastyczny. W Go zasady OOP schodzą na dalszy plan. W skrajnych przypadkach może to prowadzić do rozleniwienia programisty, w większości jednak pozwala przyspieszyć czas dewelopmentu.

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software

Zamysł i idea twórców przekonały również mnie. Po stworzeniu kilku pierwszych endpointów poczułem moc drzemiącą w tym niepozornym i niezbyt popularnym języku.

Instalacja i pierwsze kroki

Hello World

Sam proces instalacji jest bardzo prosty i szczegółowo opisany w oficjalnym tutorialu. Wystartowanie zajmuje zaledwie kilkanaście minut i jesteśmy w stanie napisać sztandarowe “Hello World” w Golang.

Wystartowanie naszej aplikacji to odpalenie w konsoli komendy go run hello_world.go. Składnia jest bardzo przystępna. Na samej górze nazwa pakietu, później importy oraz funkcja główna. Prawda, że proste?

Get method

Napisanie metody zwracającej listę produktów to kilka kolejnych linijek. Na początku deklarujemy strukturę produktu. Nasz produkt na razie składać się będzie tylko z dwóch pól ID i Name. Jako że chcemy operować na tablicy, będziemy potrzebować drugiej struktury opisujący właśnie tablicę produktów.

Sama metoda getProducts to zwykły handler restowy. Lista produktów jest na razie uzupełniana w tym miejscu, docelowo będzie pobierana  z bazy danych. Dzięki metodzie json.NewEncoder możemy zwrócić dane bezpośrednio do przeglądarki.

Serwer HTTP

Zwieńczeniem naszej pracy będzie zaprezentowanie danych na lokalnym porcie 8080. Wykorzystamy do tego pakiet http.

Teraz po wpisaniu w konsoli go run main.go i wejściu na http://localhost:8080/api/product naszym oczom ukaże się efekt naszej pracy.

Podsumowanie

Głównym powodem wybrania przeze mnie języka Go do tego projektu była prostota i możliwe jak największe przyspieszenie mojej pracy. Pierwsze kroki z Golang utwierdzają mnie w tym wyborze. Zdaję sobie sprawę z tego, że schody się zaczną, prędzej czy później. Technologia, którą wybrałem do swojego backendu dopiero pokaże pazurki. Nie ma się co jednak przejmować na zapas.

Na koniec jeszcze kod w całości: