Config File
mengapa konfigurasi
best practise konfigurasi
Pada bab ini, kita akan membuat file konfigurasi menggunakan viper. Kode lengkap bisa dilihat di github.com/jacky-htg/api-go/02-config-file. Tapi disarankan untuk mengetik ulang kode dengan mengikuti pembahasan berikut agar terbiasa dengan sintaks golang.
Struktur folder bab config file adalah seperti gambar berikut ini.
[tampilkan gambar struktur folder]
Pertama, copy folder 01-simple, paste dengan nama 02-config-file. Lalu buat folder config yang berisi 2 file, yaitu file config.json dan config.go
File config.json berisi konfigurasi dari aplikasi kita dalam bentuk json, untuk sementara hanya kita isi dengan konfigurasi alamat port server.
{
"server": {
"address": ":9090"
}
}
Sedangkan file config.go berisi kode menggunakan viper untuk membaca file config.json
package config
import (
"github.com/spf13/viper"
"fmt"
)
func init() {
viper.SetConfigFile("./config/config.json")
err := viper.ReadInConfig()
if err != nil {
fmt.Println(err.Error())
panic(err.Error())
}
}
func GetString(key string)(string) {
return viper.GetString(key)
}
func GetInt(key string)(int) {
return viper.GetInt(key)
}
Pada file main.go kita tambahkan import : "github.com/jacky-htg/api-go/02-config-file/config", dan pada func main(), ubah baris http.ListenAndServe menjadi : http.ListenAndServe(config.GetString("server.address"), router). Kode lengkap file main.go terlampir seperti di bawah ini:
package main
import (
"github.com/gorilla/mux"
"time"
"net/http"
"encoding/json"
"strconv"
"github.com/jacky-htg/api-go/02-config-file/config"
)
type User struct {
ID int64
Name string
Email string
CreatedAt time.Time
UpdateAt time.Time
DeletedAt time.Time
}
var users []User
func main() {
router := mux.NewRouter()
users = append(users, User{ ID: 1, Name: "Jacky Chan"})
users = append(users, User{ ID: 2, Name: "Jet Lee", Email: "[email protected]"})
router.HandleFunc("/api/users", GetUsersEndPoint).Methods("GET")
router.HandleFunc("/api/users", CreateUserEndPoint).Methods("POST")
router.HandleFunc("/api/users/{id}", GetUserEndPoint).Methods("GET")
http.ListenAndServe(config.GetString("server.address"), router)
}
func GetUsersEndPoint(w http.ResponseWriter, _ *http.Request) {
json.NewEncoder(w).Encode(users)
}
func CreateUserEndPoint(w http.ResponseWriter, req *http.Request) {
var user User
user.Name = req.FormValue("name")
user.Email = req.FormValue("email")
// Validation
if len(user.Name) == 0 {
json.NewEncoder(w).Encode("Please suplay valid name")
return
}
if len(user.Email) == 0 {
json.NewEncoder(w).Encode("Please suplay valid email")
return
}
user.ID = int64(len(users)+1)
user.CreatedAt = time.Now()
users = append(users, user)
json.NewEncoder(w).Encode(user)
}
func GetUserEndPoint(w http.ResponseWriter, req *http.Request) {
params := mux.Vars(req)
id, _ := strconv.ParseInt(params["id"], 10, 64)
for _, v := range users {
if v.ID == id {
json.NewEncoder(w).Encode(v)
return
}
}
json.NewEncoder(w).Encode(&User{})
}