Backend

Cara Membuat REST API Golang dari Nol

Belajar membuat REST API Golang dari dasar hingga siap digunakan untuk production.

Rama Mai07 Okt 20238 min read

Pendahuluan

REST API adalah salah satu cara paling umum untuk menghubungkan frontend dan backend menggunakan protokol HTTP. Dengan Golang, kita bisa membuat server HTTP yang cepat dan ringan tanpa banyak dependency tambahan.

Membuat Server HTTP Sederhana

Berikut contoh sederhana membuat HTTP server di Golang menggunakan package bawaan net/http:


package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    })

    fmt.Println("Server running on :8080")
    http.ListenAndServe(":8080", nil)
}

Membuat Endpoint API

Sekarang kita buat endpoint khusus untuk API:


http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte(`{"message":"Hello API"}`))
})

Handling Method (GET, POST)

Untuk membuat API lebih fleksibel, kita bisa membedakan request berdasarkan method HTTP:


http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case "GET":
        w.Write([]byte("GET Request"))
    case "POST":
        w.Write([]byte("POST Request"))
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
})

Parsing JSON Request

Untuk menerima data dari client, kita bisa membaca body request dalam format JSON:


type Request struct {
    Name string `json:"name"`
}

http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
    var req Request
    json.NewDecoder(r.Body).Decode(&req)

    response := fmt.Sprintf("Hello %s", req.Name)
    w.Write([]byte(response))
})

Response JSON

Gunakan encoding/json untuk mengirim response dalam format JSON:


type Response struct {
    Message string `json:"message"`
}

http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
    res := Response{Message: "Success"}
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(res)
})

Routing Lebih Rapi

Agar code lebih terstruktur, pisahkan handler ke function:


func apiHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("API Endpoint"))
}

func main() {
    http.HandleFunc("/api", apiHandler)
    http.ListenAndServe(":8080", nil)
}

Middleware Sederhana

Middleware digunakan untuk logging, authentication, atau validasi request:


func logger(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Request:", r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/api", apiHandler)

    http.ListenAndServe(":8080", logger(mux))
}

Testing API

Kamu bisa mengetes API menggunakan curl atau Postman:


curl http://localhost:8080/api

Best Practice

  • Gunakan struct untuk request dan response
  • Selalu set Content-Type JSON
  • Pisahkan handler agar code lebih clean
  • Gunakan middleware untuk logging dan auth
  • Validasi input dari client

Kesimpulan

Dengan package net/http bawaan Golang, kita sudah bisa membuat REST API yang cepat dan efisien. Untuk project besar, kamu bisa menggunakan framework seperti Gin atau Fiber untuk mempermudah routing dan middleware.