Cara menggunakan mysql json append

Tutorial Golang ke-42 yaitu membuat REST API dengan Golang menggunakan Database MySQL dimana tutorial ini akan melakukan insert data dalam bentuk data json.

Sebelumnya kita sudah belajar golang mengenai cara menampilkan data REST API dengan database MySQL dengan Golang. Pada tutorial kali ini merupakan tutorial lanjutan dari tutorial membuat rest api menggunakan Golang + MySQL.

Bagi anda yang belum mempelajari tutorial sebelumnya harap ikuti tutorial sebelumnya, karena sangat berkaitan.

Daftar Isi

Membuat REST API + MySQL – Insert Data

Apa yang ingin di lakukan pada tutorial ini ?

  • Membuat Query insert data ke database MySQL.
  • Membuat Routing untuk POST.
  • Membuat Method baru untuk menerima data.

Membuat Routing dan Method Baru

Membuat routing dan method baru ini pada file main.go. Silahkan buka kembali file main.go nya kemudiian tambahkan kode berikut ini :

func main() { http.HandleFunc("/mahasiswa", GetMahasiswa) http.HandleFunc("/mahasiswa/create", PostMahasiswa) err := http.ListenAndServe(":7000", nil) if err != nil { log.Fatal(err) } }

Lalu buat method baru dengan nama PostMahasiswa() dengan http handler. Berikut ini isi dari method tersebut.

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 }

Kode golang di atas lumayan panjang, mari kita bahas. Method yang di ijinkan pada fungsi tersebut adalah POST. Pada kode di atas langkah awal kita harus memeriksa content type pada header, apabila data tersebut berupa json maka akan di lanjutkan.

Baris berikutnya yaitu melakukan decode dari data json di tandai dengan potongan kode 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 } 0. Kita menggunakan variable mhs agar data yang di insert sesuai dengan model struct Mahasiswa.

Apabila sudah isi dari variable mhs akan di kirim pada fungsi 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 } 1 pada file 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 } 2. Asumsikan kita sudah memiliki fungsi tersebut.

Jika di gabungkan dengan kode sebelumnya maka file main.go akan berisi file kode baris berikut ini.

main,go

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) 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 }

Sekarang kita lanjut membuat query insert data ke MySQL dengan Golang.

Query Insert Data ke Database MySQL dengan Golang

Sekarang kita buat fungsi baru di file 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 } 2. Kita akan membuat fungsi dengan nama 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 } 4.

Berikut ini kodenya :

mahasiswa/repository_mysql.go

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 }

Kode di atas cukup sederhana dan mudah di mengerti. Perhatikan kode di atas, terdapat variable dengan nama 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 } 5 dimana variable tersebut berisi query untuk melakukan insert ke database MySQL.

Lalu agar query teks tersebut dapat di ekstekusi maka kita dapat menggunakan kode 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 } 6 dengan parameter context dan query teksnya.

Sehingga kode lengkap untuk menampilkan data dan insert data MySQL dengan Golang seperti di bawah ini.

mahasiswa/repository_mysql.go

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 }

Oke kode sudah kita buat semuanya, sekarang kita lakukan pengujian.

Uji Coba Insert data REST API dengan Golang + MySQL

Kita sudah mengerti bahwa untuk fungsi 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 } 7 mahasiswa hanya memperbolehkan method POST. Maka kita dapat melakukan uji coba menggunakan postman.

Sebelumnya silahkan jalankan dulu program golang nya.

`go run main.go`

Lalu silahkan buka postman dan akses dengan URL : //localhost:7000/mahasiswa/create.

Langkah pengujian dengan postman hal pertama anda harus mencetang 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 } 9 dengan value 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) 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 } 0 pada tab header.

Selanjutnya untuk mengirim data yang ingin di simpan silahkan buka pada tab 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) 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 } 1 lalu pilih 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) 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 } 2 dan pada bagian paling kanan yang awalnya teks silahkan di ganti menjadi json.

Dan hal yang paling penting jangan lupa menyetel request dengan method POST.

Cara melakukan insert data API ke MySQL dengan Golang

Jika responsenya dengan kode status 201(created) dan responnya sama dengan gambar di atas maka artinya insert data api dari golang ke MySQL berhasil kita lakukan.

Untuk memastikan apakah data benar-benar masuk, silahkan akses URL yang berguna untuk menampilkan data API, seperti pada tutorial sebelumnya yaitu //localhost:7000/mahasiswa.

Cara menampilkan data API ke MySQL dengan Golang

Perhatikan gambar di atas, terdapat data baru pada baris objek notasi pertama dimana data tersebut sesuai dengan apa yang telah kita inputkan.

Postingan terbaru

LIHAT SEMUA