Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
Implementasi Rest API dengan Golang
News Go

Implementasi Rest API dengan Golang

04 July 2024 · 4 menit baca · Ihsan Arif

REST API (Representational State Transfer Application Programming Interface) adalah salah satu arsitektur yang paling umum digunakan dalam pengembangan aplikasi web.

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:

sh
1mkdir todo-api
2cd todo-api
3go mod init todo-api
Kemudian, instal library httprouter:
sh
1go 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:

go
1todo-api/
2├── main.go
3├── handlers/
4   └── todo.go
5├── models/
6   └── todo.go
7└── router/
8    └── router.go

3. Model Todo

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

go
1package models
2
3type Todo struct {
4    ID     string `json:"id"`
5    Title  string `json:"title"`
6    Status string `json:"status"`
7}

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:

go
 1package handlers
 2
 3import (
 4    "encoding/json"
 5    "net/http"
 6    "todo-api/models"
 7
 8    "github.com/julienschmidt/httprouter"
 9)
10
11var todos = []models.Todo{}
12
13func GetTodos(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
14    w.Header().Set("Content-Type", "application/json")
15    json.NewEncoder(w).Encode(todos)
16}
17
18func GetTodoByID(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
19    id := ps.ByName("id")
20    for _, todo := range todos {
21        if todo.ID == id {
22            w.Header().Set("Content-Type", "application/json")
23            json.NewEncoder(w).Encode(todo)
24            return
25        }
26    }
27    http.Error(w, "Todo not found", http.StatusNotFound)
28}
29
30func CreateTodo(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
31    var todo models.Todo
32    json.NewDecoder(r.Body).Decode(&todo)
33    todos = append(todos, todo)
34    w.Header().Set("Content-Type", "application/json")
35    json.NewEncoder(w).Encode(todo)
36}
37
38func UpdateTodo(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
39    id := ps.ByName("id")
40    for i, todo := range todos {
41        if todo.ID == id {
42            json.NewDecoder(r.Body).Decode(&todo)
43            todos[i] = todo
44            w.Header().Set("Content-Type", "application/json")
45            json.NewEncoder(w).Encode(todo)
46            return
47        }
48    }
49    http.Error(w, "Todo not found", http.StatusNotFound)
50}
51
52func DeleteTodo(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
53    id := ps.ByName("id")
54    for i, todo := range todos {
55        if todo.ID == id {
56            todos = append(todos[:i], todos[i+1:]...)
57            w.Header().Set("Content-Type", "application/json")
58            json.NewEncoder(w).Encode(todos)
59            return
60        }
61    }
62    http.Error(w, "Todo not found", http.StatusNotFound)
63}

5. Router

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

go
 1package router
 2
 3import (
 4    "todo-api/handlers"
 5
 6    "github.com/julienschmidt/httprouter"
 7)
 8
 9func NewRouter() *httprouter.Router {
10    router := httprouter.New()
11    router.GET("/todos", handlers.GetTodos)
12    router.GET("/todos/:id", handlers.GetTodoByID)
13    router.POST("/todos", handlers.CreateTodo)
14    router.PUT("/todos/:id", handlers.UpdateTodo)
15    router.DELETE("/todos/:id", handlers.DeleteTodo)
16    return router
17}

6. Main Function

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

go
 1package main
 2
 3import (
 4    "log"
 5    "net/http"
 6    "todo-api/router"
 7)
 8
 9func main() {
10    r := router.NewRouter()
11    log.Fatal(http.ListenAndServe(":8080", r))
12}

7. Menjalankan Server

Untuk menjalankan server, cukup jalankan perintah berikut di terminal:

sh
1go 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:

sh
1Copy code
2curl -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!

IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar