tips-dan-trik

Implementasi Rest API dengan Golang

Pengantar

REST API (Representational State Transfer Application Programming Interface) adalah salah satu arsitektur yang paling umum digunakan dalam pengembangan aplikasi web. Dengan REST API, aplikasi dapat berkomunikasi satu sama lain melalui HTTP request. Golang, dengan kecepatan dan efisiensinya, adalah pilihan yang tepat untuk membangun REST API yang cepat dan dapat diandalkan. Dalam artikel ini, kita akan membahas bagaimana mengimplementasikan REST API dengan Golang menggunakan library httprouter. Kita akan membuat API sederhana untuk mengelola daftar tugas (to-do list).

1. Persiapan Lingkungan

Sebelum mulai mengembangkan API, pastikan Golang sudah terinstal di sistem Anda. Jika belum, Anda bisa mengunduhnya dari situs resmi Golang. Setelah itu, buat direktori baru untuk proyek Anda dan inisialisasi module Go:

mkdir todo-api
cd todo-api
go mod init todo-api

Kemudian, instal library httprouter:

go get github.com/julienschmidt/httprouter

2. Struktur Proyek

Struktur proyek yang rapi sangat penting untuk memudahkan pengembangan dan pemeliharaan. Berikut adalah struktur dasar proyek kita:

todo-api/
├── main.go
├── handlers/
   └── todo.go
├── models/
   └── todo.go
└── router/
    └── router.go

3. Model Todo

Pertama, kita buat model Todo di models/todo.go:

package models

type Todo struct {
    ID     string `json:"id"`
    Title  string `json:"title"`
    Status string `json:"status"`
}

Model ini akan digunakan untuk merepresentasikan data tugas dalam API kita.

4. Handler Todo

Selanjutnya, kita buat handler untuk mengelola request di handlers/todo.go:

package handlers

import (
    "encoding/json"
    "net/http"
    "todo-api/models"

    "github.com/julienschmidt/httprouter"
)

var todos = []models.Todo{}

func GetTodos(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(todos)
}

func GetTodoByID(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    id := ps.ByName("id")
    for _, todo := range todos {
        if todo.ID == id {
            w.Header().Set("Content-Type", "application/json")
            json.NewEncoder(w).Encode(todo)
            return
        }
    }
    http.Error(w, "Todo not found", http.StatusNotFound)
}

func CreateTodo(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    var todo models.Todo
    json.NewDecoder(r.Body).Decode(&todo)
    todos = append(todos, todo)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(todo)
}

func UpdateTodo(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    id := ps.ByName("id")
    for i, todo := range todos {
        if todo.ID == id {
            json.NewDecoder(r.Body).Decode(&todo)
            todos[i] = todo
            w.Header().Set("Content-Type", "application/json")
            json.NewEncoder(w).Encode(todo)
            return
        }
    }
    http.Error(w, "Todo not found", http.StatusNotFound)
}

func DeleteTodo(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    id := ps.ByName("id")
    for i, todo := range todos {
        if todo.ID == id {
            todos = append(todos[:i], todos[i+1:]...)
            w.Header().Set("Content-Type", "application/json")
            json.NewEncoder(w).Encode(todos)
            return
        }
    }
    http.Error(w, "Todo not found", http.StatusNotFound)
}

5. Router

Kemudian, kita buat router di router/router.go:

package router

import (
    "todo-api/handlers"

    "github.com/julienschmidt/httprouter"
)

func NewRouter() *httprouter.Router {
    router := httprouter.New()
    router.GET("/todos", handlers.GetTodos)
    router.GET("/todos/:id", handlers.GetTodoByID)
    router.POST("/todos", handlers.CreateTodo)
    router.PUT("/todos/:id", handlers.UpdateTodo)
    router.DELETE("/todos/:id", handlers.DeleteTodo)
    return router
}

6. Main Function

Terakhir, kita buat fungsi utama untuk menjalankan server di main.go:

package main

import (
    "log"
    "net/http"
    "todo-api/router"
)

func main() {
    r := router.NewRouter()
    log.Fatal(http.ListenAndServe(":8080", r))
}

7. Menjalankan Server

Untuk menjalankan server, cukup jalankan perintah berikut di terminal:

go run main.go

Server akan berjalan di http://localhost:8080 dan Anda bisa mulai mengakses endpoint yang telah kita buat.

8. Menguji API

Anda bisa menggunakan tools seperti Postman atau cURL untuk menguji endpoint API yang telah kita buat.

  • GET /todos: Mengambil semua todo.
  • GET /todos/: Mengambil todo berdasarkan ID.
  • POST /todos: Membuat todo baru.
  • PUT /todos/: Memperbarui todo berdasarkan ID.
  • DELETE /todos/: Menghapus todo berdasarkan ID.

Berikut adalah contoh request untuk membuat todo baru menggunakan cURL:

Copy code
curl -X POST http://localhost:8080/todos -H "Content-Type: application/json" -d '{"id":"1","title":"Learn Golang","status":"In Progress"}'

Kesimpulan

Dengan mengikuti langkah-langkah di atas, Anda telah berhasil mengimplementasikan REST API sederhana dengan Golang menggunakan library httprouter. API ini memungkinkan Anda untuk mengelola daftar tugas (to-do list) dengan operasi CRUD dasar. Untuk memperdalam pemahaman dan mempelajari konsep arsitektur yang lebih kompleks, Anda bisa membaca tutorial RESTful API dan Clean Architecture dengan Golang. Semoga artikel ini bermanfaat dan memberikan dasar yang kuat untuk pengembangan API lebih lanjut. Selamat berkoding!

comments powered by Disqus