Tutorial Golang ke-43 yaitu membuat REST API dengan Golang menggunakan Database MySQL dimana tutorial ini akan melakukan update data dalam bentuk data json.
Tutorial ini lanjutan dari tutorial golang sebelumnya yaitu :
- Belajar Golang #42 : Membuat REST API + MySQL – Insert Data
- Belajar Golang #41 : Membuat REST API + MySQL – Menampilkan Data
- Belajar Golang #40 : Membuat REST API + MySQL – Koneksi Database
Apabila anda sebelum nya belum melakukan tutorial sebelumnya, hukumnya wajib untuk kembali ke tutorial sebelumnya karena sangat berhubungan.
Pada akhir tutorial REST API Golang nanti kita berhasil membuat CRUD API dengan Golang dan MySQL.
Membuat REST API + MySQL – Update Data
Sekarang kita akan melakukan update data MySQL Golang dengan tabel mahasiswa
.
Apa aja yang ingin kita lakukan ?
- Membuat Routing dan Method/Fungsi
- Membuat Fungsi untuk Query Update ke Database MySQL.
Yuk kita bahas..
Membuat Routing Update dan Method baru
Untuk membuat fungsi dan routing baru menggunakan file main.go. Kita akan membuat method dengan nama UpdateMahasiswa()
.
Berikut ini tambahan kode routing updatenya :
1 | http.HandleFunc("/mahasiswa/update", UpdateMahasiswa) |
Berikut ini fungsi baru untuk melakukan update.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // UpdateMahasiswa func UpdateMahasiswa(w http.ResponseWriter, r *http.Request) { if r.Method == "PUT" { if r.Header.Get("Content-Type") != "application/json" { http.Error(w, "Gunakan content type application / json", http.StatusBadRequest) return } ctx, cancel := context.WithCancel(context.Background()) defer cancel() var mhs models.Mahasiswa if err := json.NewDecoder(r.Body).Decode(&mhs); err != nil { utils.ResponseJSON(w, err, http.StatusBadRequest) return } fmt.Println(mhs) if err := mahasiswa.Update(ctx, mhs); err != nil { utils.ResponseJSON(w, err, http.StatusInternalServerError) return } res := map[string]string{ "status": "Succesfully", } utils.ResponseJSON(w, res, http.StatusCreated) return } http.Error(w, "Tidak di ijinkan", http.StatusMethodNotAllowed) return } |
Perhatikan kode di atas, jika di lihat kode golang di atas mirip dengan kode untuk melakukan insert data pada tutorial sebelumnya. Hanya saja yang membedakan yaitu method yang di ijinkan.
Method yang di ijinkan untuuk http request adalah PUT
.
Berikut ini kode lengkapnya pada file main.go
.
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | package main import ( "context" "encoding/json" "fmt" "github.com/kodingin/api-mysql/mahasiswa" "github.com/kodingin/api-mysql/models" "github.com/kodingin/api-mysql/utils" "log" "net/http" ) func main() { http.HandleFunc("/mahasiswa", GetMahasiswa) http.HandleFunc("/mahasiswa/create", PostMahasiswa) http.HandleFunc("/mahasiswa/update", UpdateMahasiswa) err := http.ListenAndServe(":7000", nil) if err != nil { log.Fatal(err) } } // GetMahasiswa func GetMahasiswa(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { ctx, cancel := context.WithCancel(context.Background()) defer cancel() mahasiswas, err := mahasiswa.GetAll(ctx) if err != nil { fmt.Println(err) } utils.ResponseJSON(w, mahasiswas, http.StatusOK) return } http.Error(w, "Tidak di ijinkan", http.StatusMethodNotAllowed) return } // PostMahasiswa func PostMahasiswa(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { if r.Header.Get("Content-Type") != "application/json" { http.Error(w, "Gunakan content type application / json", http.StatusBadRequest) return } ctx, cancel := context.WithCancel(context.Background()) defer cancel() var mhs models.Mahasiswa if err := json.NewDecoder(r.Body).Decode(&mhs); err != nil { utils.ResponseJSON(w, err, http.StatusBadRequest) return } if err := mahasiswa.Insert(ctx, mhs); err != nil { utils.ResponseJSON(w, err, http.StatusInternalServerError) return } res := map[string]string{ "status": "Succesfully", } utils.ResponseJSON(w, res, http.StatusCreated) return } http.Error(w, "Tidak di ijinkan", http.StatusMethodNotAllowed) return } // UpdateMahasiswa func UpdateMahasiswa(w http.ResponseWriter, r *http.Request) { if r.Method == "PUT" { if r.Header.Get("Content-Type") != "application/json" { http.Error(w, "Gunakan content type application / json", http.StatusBadRequest) return } ctx, cancel := context.WithCancel(context.Background()) defer cancel() var mhs models.Mahasiswa if err := json.NewDecoder(r.Body).Decode(&mhs); err != nil { utils.ResponseJSON(w, err, http.StatusBadRequest) return } fmt.Println(mhs) if err := mahasiswa.Update(ctx, mhs); err != nil { utils.ResponseJSON(w, err, http.StatusInternalServerError) return } res := map[string]string{ "status": "Succesfully", } utils.ResponseJSON(w, res, http.StatusCreated) return } http.Error(w, "Tidak di ijinkan", http.StatusMethodNotAllowed) return } |
Sekarang kita akan membuat fungsi untuk melakukan query update ke MySQL.
Query Update Data ke Database MySQL dengan Golang
Untuk membuat query update data MySQL kita menggunakan file mahasiswa/repository_mysql.go
dengan nama fungsi Update()
.
Berikut ini fungsi update nya :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // Update func Update(ctx context.Context, mhs models.Mahasiswa) error { db, err := config.MySQL() if err != nil { log.Fatal("Can't connect to MySQL", err) } queryText := fmt.Sprintf("UPDATE %v set nim = %d, name ='%s', semester = %d, updated_at = '%v' where id = '%d'", table, mhs.NIM, mhs.Name, mhs.Semester, time.Now().Format(layoutDateTime), mhs.ID, ) fmt.Println(queryText) _, err = db.ExecContext(ctx, queryText) if err != nil { return err } return nil } |
Kode di atas lumayan sederhana, hanya digunakan untuk melakukan query update pada umumnya. Saya rasa anda sudah familiar dengan kode di atas.
Berikut ini Kode golang full pada file mahasiswa/repository_mysql.go
mahasiswa/repository_mysql.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | package mahasiswa import ( "context" "fmt" "github.com/kodingin/api-mysql/config" "github.com/kodingin/api-mysql/models" "log" "time" ) const ( table = "mahasiswa" layoutDateTime = "2006-01-02 15:04:05" ) // GetAll func GetAll(ctx context.Context) ([]models.Mahasiswa, error) { var mahasiswas []models.Mahasiswa db, err := config.MySQL() if err != nil { log.Fatal("Cant connect to MySQL", err) } queryText := fmt.Sprintf("SELECT * FROM %v Order By id DESC", table) rowQuery, err := db.QueryContext(ctx, queryText) if err != nil { log.Fatal(err) } for rowQuery.Next() { var mahasiswa models.Mahasiswa var createdAt, updatedAt string if err = rowQuery.Scan(&mahasiswa.ID, &mahasiswa.NIM, &mahasiswa.Name, &mahasiswa.Semester, &createdAt, &updatedAt); err != nil { return nil, err } // Change format string to datetime for created_at and updated_at mahasiswa.CreatedAt, err = time.Parse(layoutDateTime, createdAt) if err != nil { log.Fatal(err) } mahasiswa.UpdatedAt, err = time.Parse(layoutDateTime, updatedAt) if err != nil { log.Fatal(err) } mahasiswas = append(mahasiswas, mahasiswa) } return mahasiswas, nil } // Insert func Insert(ctx context.Context, mhs models.Mahasiswa) error { db, err := config.MySQL() if err != nil { log.Fatal("Can't connect to MySQL", err) } queryText := fmt.Sprintf("INSERT INTO %v (nim, name, semester, created_at, updated_at) values(%v,'%v',%v,'%v','%v')", table, mhs.NIM, mhs.Name, mhs.Semester, time.Now().Format(layoutDateTime), time.Now().Format(layoutDateTime)) _, err = db.ExecContext(ctx, queryText) if err != nil { return err } return nil } // Update func Update(ctx context.Context, mhs models.Mahasiswa) error { db, err := config.MySQL() if err != nil { log.Fatal("Can't connect to MySQL", err) } queryText := fmt.Sprintf("UPDATE %v set nim = %d, name ='%s', semester = %d, updated_at = '%v' where id = '%d'", table, mhs.NIM, mhs.Name, mhs.Semester, time.Now().Format(layoutDateTime), mhs.ID, ) fmt.Println(queryText) _, err = db.ExecContext(ctx, queryText) if err != nil { return err } return nil } |
Uji Coba Update data REST API dengan Golang + MySQL
Untuk melakukan uji coba dapat melakukan pengujian ke URL : http://localhost:7000/mahasiswa/update dengan method PUT
di mana pengujian kali ini tetap menggunakan postman.
Perlu di ketahui cara melakukan update isi yang harus di isi seperti hal nya melakukan insert data yaitu pada bagian body dan header.

Perhatikan gambar di atas, terdapat data baru dengan id 8
yang ingin di lakukan update data.
Sekarang kita lihat hasilnya, apakah data tersebut berubah atau tidak.
Silahkan akses end point : http://localhost:7000/mahasiswa dengan method GET
.

Gambar di atas telah menunjukkan bahwa data sudah berubah menjadi data yang telah kita update.
Sekian tutorial melakukan update data API dengan Golang dan MySQL. Terima kasih.