Tutorial Restful API Golang #5 : Menampilkan Detail Data By ID


Tutorial Restful API Golang #5 : Menampilkan Detail Data By ID

Halo teman-teman semuanya, pada artikel sebelumnya kita telah belajar bersama-sama bagaimana cara melakukan proses insert data ke dalam database di Go dan pada kesempatan kali ini, kita semua akan belajar bagaimana cara menampilkan detail data berdasarkan ID di Go.

Langkah 1 - Menambahkan Function FindPostById di Controller

Disini kita akan menambahkan fungsi baru di dalam controller, jadi silahkan teman-teman buka file controllers/postsController.go, kemudian ubah kode-nya menjadi seperti berikut ini.

controllers/postController.go

package controllers

import (
	"errors"
	"net/http"
	"santrikoding/backend-api/models"

	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
)

// type validation post input
type ValidatePostInput struct {
	Title   string `json:"title" binding:"required"`
	Content string `json:"content" binding:"required"`
}

// type error message
type ErrorMsg struct {
	Field   string `json:"field"`
	Message string `json:"message"`
}

// function get error message
func GetErrorMsg(fe validator.FieldError) string {
	switch fe.Tag() {
	case "required":
		return "This field is required"
	}
	return "Unknown error"
}

// get all posts
func FindPosts(c *gin.Context) {

	//get data from database using model
	var posts []models.Post
	models.DB.Find(&posts)

	//return json
	c.JSON(200, gin.H{
		"success": true,
		"message": "Lists Data Posts",
		"data":    posts,
	})
}

// store a post
func StorePost(c *gin.Context) {
	//validate input
	var input ValidatePostInput
	if err := c.ShouldBindJSON(&input); err != nil {
		var ve validator.ValidationErrors
		if errors.As(err, &ve) {
			out := make([]ErrorMsg, len(ve))
			for i, fe := range ve {
				out[i] = ErrorMsg{fe.Field(), GetErrorMsg(fe)}
			}
			c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errors": out})
		}
		return
	}

	//create post
	post := models.Post{
		Title:   input.Title,
		Content: input.Content,
	}
	models.DB.Create(&post)

	//return response json
	c.JSON(201, gin.H{
		"success": true,
		"message": "Post Created Successfully",
		"data":    post,
	})
}

// get post by id
func FindPostById(c *gin.Context) {
	var post models.Post
	if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
		return
	}

	c.JSON(200, gin.H{
		"success": true,
		"message": "Detail Data Post By ID : " + c.Param("id"),
		"data":    post,
	})
}

Dari perubahan kode di atas, kita menambahkan function baru dengan nama FindPostById.

// get post by id
func FindPostById(c *gin.Context) {

	//...
	
}

Kemudian kita membuat sebuah variabel bernama post dengan tipe data models.Post. Ini berarti variabel post akan digunakan untuk menyimpan data dari sebuah post.

var post models.Post

Setelah itu, kita membuat kondisi untuk mencari detail data post berdasarkan parameter dari context c.Param("id").

if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
        return
}

Di atas, jika data post berdasarkan ID tidak ditemukan, maka kita akan mengembalikan sebuah response dengan pesan Record not found!.

Tapi, jika data ditemukan, maka kita akan mengembalikan sebuah response dalam format JSON dengan informasi detail data post.

c.JSON(200, gin.H{
        "success": true,
        "message": "Detail Data Post By ID : " + c.Param("id"),
        "data":    post,
})

Langkah 2 - Membuat Route API Detail Post

Setelah berhasil menambahkan fungsi di dalam controller, maka langkah berikutnya adalah membuatkan route-nya.

Silahkan teman-teman buka file main.go, kemudian ubah semua kode-nya menjadi seperti berikut ini.

main.go

package main

import (
	"santrikoding/backend-api/controllers"
	"santrikoding/backend-api/models"

	"github.com/gin-gonic/gin"
)

func main() {
	//inisialiasai Gin
	router := gin.Default()

	//panggil koneksi database
	models.ConnectDatabase()

	//membuat route dengan method GET
	router.GET("/", func(c *gin.Context) {

		//return response JSON
		c.JSON(200, gin.H{
			"message": "Hello World!",
		})
	})

	//membuat route get all posts
	router.GET("/api/posts", controllers.FindPosts)

	//membuat route store post
	router.POST("/api/posts", controllers.StorePost)

	//membuat route detail post
	router.GET("/api/posts/:id", controllers.FindPostById)

	//mulai server dengan port 3000
	router.Run(":3000")
}

Dari perubahan kode di atas, kita menambahkan route baru dengan method GET dan path yang digunakan adalah /api/posts/:id.

//membuat route detail post
router.GET("/api/posts/:id", controllers.FindPostById)

Langkah 3 - Uji Coba Rest API Detail Post

Silahkan restrat server Go-nya terlebih dahulu, yaitu dengan cara distop dan start lagi.

Silahkan teman-teman buka aplikasi Postman, kemudian pada bagian URL silahkan masukkan berikut ini http://localhost:3000/api/posts/1 dan untuk method-nya silahkan pilih GET.

Di atas, kita berikan contoh melakukan get data dengan ID 1

Jika sudah, silahkan klik Send dan jika berhasil maka kita akan mendapatkan response JSON yang berisi informasi detail data post by ID.

{
    "data": {
        "id": 1,
        "title": "Belajar Restful API Golang",
        "content": "Di SantriKoding"
    },
    "message": "Detail Data Post By ID : 1",
    "success": true
}

Kesimpulan

Pada artikel ini, kita semua telah belajar bagaimana cara menampilkan detail data berdasarkan ID di dalam Go dan pada artikel berikutnya, kita semua akan belajar melakukan proses update data ke dalam database di Go.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami