Json
JSON adalah format response API yang cukup populer. Bab ini kita akan membuat response dalam format json.
Sebagai sample, kita akan membuang/menghapus handler HelloWorld dan menggantinya dengan handler ListUsers
Membuat type struct User
Membuat handler ListUsers untuk menampilkan list users
package main
import (
"context"
"encoding/json"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// parameter server
server := http.Server{
Addr: "0.0.0.0:9000",
Handler: http.HandlerFunc(ListUsers),
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
serverErrors := make(chan error, 1)
// mulai listening server
go func() {
log.Println("server listening on", server.Addr)
serverErrors <- server.ListenAndServe()
}()
// Membuat channel untuk mendengarkan sinyal interupsi/terminate dari OS.
// Menggunakan channel buffered karena paket signal membutuhkannya.
shutdown := make(chan os.Signal, 1)
signal.Notify(shutdown, os.Interrupt, syscall.SIGTERM)
// Mengontrol penerimaan data dari channel,
// jika ada error saat listenAndServe server maupun ada sinyal shutdown yang diterima
select {
case err := <-serverErrors:
log.Fatalf("error: listening and serving: %s", err)
case <-shutdown:
log.Println("caught signal, shutting down")
// Jika ada shutdown, meminta tambahan waktu 5 detik untuk menyelesaikan proses yang sedang berjalan.
const timeout = 5 * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Printf("error: gracefully shutting down server: %s", err)
if err := server.Close(); err != nil {
log.Printf("error: closing server: %s", err)
}
}
}
log.Println("done")
}
// User : struct of User
type User struct {
ID uint
Username string
Password string
Email string
IsActive bool
}
// ListUsers : http handler for returning list of users
func ListUsers(w http.ResponseWriter, r *http.Request) {
list := []User{
{ID: 1, Username: "jackyhtg", Email: "jacky@htg.com", IsActive: true},
{ID: 2, Username: "jetlee", Email: "jet@lee.com", IsActive: true},
}
data, err := json.Marshal(list)
if err != nil {
log.Println("error marshalling result", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusOK)
if _, err := w.Write(data); err != nil {
log.Println("error writing result", err)
}
}
Last updated
Was this helpful?