Decoding Base64 Into Image File using Go

Kali ini saya akan membahas bagaimana melakukan decoding kode base64 menjadi file image menggunakan Go. Teknik ini biasanya digunakan dalam aplikasi yang berbasis REST. Misalnya ketika user melakukan upload foto, UI layer akan mengirimkan kode base64 ke backend API untuk memproses data tersebut. Apabila user mengirim kode base64 untuk data image, maka backend API akan melakukan decoding untuk men-generate file image tersebut.

Misalnya, user mengirim json berikut.

{
   "data" : "{base64}", // diisi dengan kode base64
   "title": "Raka Teja
}

Maka, sistem akan men-generate file image berdasarkan kode base64 diatas. Dalam artikel ini, saya menggunakan Go Martini untuk memudahkan dalam pembuatan RESTful API.

func main() {
   server := martini.Classic()
   server.Post("/image", imageHandler)
   server.Run()
}

func imageHandler(rw http.ResponseWriter, req *http.Request) {
   body, err := ioutil.ReadAll(req.Body)
   if err != nil {
      panic(err)
   }
   if err := req.Body.Close(); err != nil {
      panic(err)
   }
   
   var image Image
   if err := json.Unmarshal(body, &image); err != nil {
      panic(err)
   }

   go writeImage(image)
   
   fmt.Fprint(rw, "Success")
}
func writeImage(image Image) {
   data, err := base64.StdEncoding.DecodeString(image.Data)
   if err != nil {
      panic(err)
   }

   file, err := os.Create(fileName(image))
   if err != nil {
      panic(err)
   }
   defer file.Close()

   n, err := file.Write(data)
   if err != nil {
      panic(err)
   }

   fmt.Println("File size :", n)

}

func fileName(image Image) string {
   name := strings.Replace(image.Title, " ", "-", -1)
   return strings.ToLower(name) + ".png"
}

 Kemudian, silahkan build dan jalankan.

go build server.go

./server

Setelah di-test, nanti akan muncul file image dengan nama file sesuai dengan request body yang dikirim.

Sekian, happy coding \m/

Constructor di Go

Secara default, Go sebenarnya tidak menyediakan fitur constructor layaknya bahasa pemrograman yang lain. Namun dengan teknik yang cukup sederhana dan apabila diperlukan. Kita bisa memanfaatkan function sebagai constructor ketika proses instance dilakukan. Dalam artikel ini, saya akan menggunakan struct Person berikut.

type Person struct {
   FirstName string
   LastName  string
   Birthday  time.Time  
}

Constructor Tanpa Arguments

Selanjutnya mari kita buat constructor sederhana(tanpa arguments) untuk struct Person diatas.

func NewPerson() *Person {
  return &Person{}
}

Sehingga pada proses instansiasi, kita tinggal memanggil function tersebut.

person := NewPerson()

Constructor dengan Arguments
Agar bisa menggunakan arguments, kita boleh menambahkan langsung arguments tersebut di function yang akan kita jadikan construct. Kemudian seperti contoh diatas, kita kembalikan hasil instance dari struct People tersebut.

func NewPerson(f, l string, b time.Time) *Person {
   return &Person{
      FirstName: f,
      LastName:  l,
      Birthday:  b, 
   }
}
person := NewPerson(
   "I Made", 
   "Raka",
   time.Date(1992, time.January, 7, 0, 0, 0, 0, time.UTC),
)

Perhatikan

Di dua contoh diatas saya membuat 2 function dengan nama yang sama, di Go kita tidak diizinkan membuat 2 function dengan nama yang sama. Walaupun dengan arguments yang berbeda. Maka dari itu, untuk construct diatas tolong implementasikan salah satu saja. Terimakasih.

Good luck😉

Web server sederhana dengan Golang

Membuat website dengan Golang cukup mudah. Kita hanya memerlukan package net/http untuk membuat web server sederhana untuk handling setiap http request yang masuk. Kali ini saya hanya akan membuat web server untuk handling 2 endpoint, yang hanya akan menampilkan text sederhana.

Pertama buat file static.go, untuk membuat web server langsung saja initialize abstract data type Server, yang ada di package net/http.

server := http.Server{
     Addr: ":8080",
     Handler: &httpHandler{},
}
server.ListenAndServe()

Pada source code diatas terlihat, kita melakukan initialize httpHandler, untuk itu kita perlu membuat abstract data type httpHandler.

// HTTP Handler
type httpHandler struct{}

// Handling http request
func (handler *httpHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
	if endpoint, ok := routes[req.URL.String()]; ok {
		endpoint(rw, req)
	}
}

Setelah membuat struct yang akan melakukan handling setiap http request, kita perlu membuat map untuk mendeskripsikan endpoint yang kita sediakan, serta function untuk setiap endpoint tersebut. Di source code diatas, terlihat kita melakukan pengecekan ke map `routes`. Maka dari itu kita perlu membuat map `routes`.


var routes map[string]func(http.ResponseWrite, *http.Request)

Selanjutnya kita perlu mendeskripsikan endpoint apa saja yang sediakan.

routes = make(map[string]func(http.ResponseWriter, *http.Request))
routes["/hello"] = hello
routes["/"] = home

Perlu juga untuk menyediakan aksi untuk setiap endpoint tersebut.

// Home endpoint
func home(rw http.ResponseWriter, req *http.Request) {
	fmt.Fprint(rw, "Home")
}

// Say hello endpoint
func hello(rw http.ResponseWriter, req *http.Request) {
	fmt.Fprint(rw, "Hello World")
}

Karena kita menggunakan beberapa package untuk membuat aplikasi ini, maka kita perlu melakukan import untuk setiap package tersebut.

import (
	"fmt"
	"net/http"
)

Ok, selesai. Silahkan check disini untuk source code lengkap-nya. Gunakan perintah berikut untuk menjalankan aplikasi diatas.

go build static.go

./static

Sekian, dan semoga bermanfaat

References: 

Building a web server in Go [http://thenewstack.io/building-a-web-server-in-go/]

Package http [https://golang.org/pkg/net/http/]

Automated Testing di Golang

Beberapa hari yang lalu saya sempet posting tentang Golang, yaitu solusi untuk menyelesaikan masalah seorang petugas perpustakaan, bisa dilihat disini. Namun di kode tersebut saya belum menyediakan fasilitas untuk automated testing. Kali ini saya akan melengkapi (juga memperbaiki) kode tersebut dengan automated testing. Go sudah menyediakan package untuk melakukan automated testing (https://golang.org/pkg/testing/) sehingga untuk saat ini kita cukup menggunakan package tersebut.

Selanjutnya tinggal jalankan perintah, `go test` untuk melihat hasil dari proses testing tersebut. Tambahkan `-cover` apabila kita ingin mengetahui seberapa persen kode logic kita yang sudah ter-cover oleh automated testing.

Sekian, semoga bermanfaat😉