Golang Book API
Keling, real loyiha sifatida portfelingiz uchun mukammal CRUD API yaratamiz. Bu nafaqat kod yozish, balki professional loyihalar uchun ishlatiladigan loyiha tuzilmasi va arxitekturani ham qamrab oladi.
Loyiha tuzilmasi
Biz loyihani quyidagi tuzilma asosida tashkil qilamiz:
golang-crud/
│
├── config/ # Loyihaning konfiguratsiyasi (ma'lumotlar bazasi sozlamalari va h.k.)
├── controllers/ # CRUD funksiyalari (business logic)
├── models/ # Ma'lumotlar bazasi modellarini saqlash
├── routes/ # API marshrutlari
├── main.go # Loyihaning asosiy fayli
└── go.mod # Go modulyatsiyasi
1-qadam: Loyihani sozlash
Loyihani yaratish va modulyatsiya:
mkdir golang-crud
cd golang-crud
go mod init golang-crud
2-qadam: Kutubxonalarni o‘rnatish
RESTful API yaratish uchun quyidagilarni o‘rnatamiz:
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
3-qadam: Ma'lumotlar bazasi konfiguratsiyasi
config/database.go
Ma'lumotlar bazasi ulanishini tashkil qilamiz:
package config
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"log"
)
var DB *gorm.DB
func ConnectDatabase() {
var err error
DB, err = gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
log.Fatal("Ma'lumotlar bazasiga ulanishda xatolik:", err)
}
log.Println("Ma'lumotlar bazasi ulandi")
}
4-qadam: Modelni yaratish
models/book.go
Ma'lumotlar bazasi uchun Book
modelini yozamiz:
package models
type Book struct {
ID uint `json:"id" gorm:"primaryKey"`
Title string `json:"title"`
Author string `json:"author"`
Price float64 `json:"price"`
}
5-qadam: CRUD funksiyalari (Controller)
controllers/book_controller.go
CRUD amallarini amalga oshiruvchi funksiyalarni yozamiz:
package controllers
import (
"golang-crud/config"
"golang-crud/models"
"github.com/gin-gonic/gin"
"net/http"
)
func GetBooks(c *gin.Context) {
var books []models.Book
config.DB.Find(&books)
c.JSON(http.StatusOK, books)
}
func CreateBook(c *gin.Context) {
var book models.Book
if err := c.ShouldBindJSON(&book); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
config.DB.Create(&book)
c.JSON(http.StatusOK, book)
}
func GetBookByID(c *gin.Context) {
id := c.Param("id")
var book models.Book
if err := config.DB.First(&book, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Kitob topilmadi!"})
return
}
c.JSON(http.StatusOK, book)
}
func UpdateBook(c *gin.Context) {
id := c.Param("id")
var book models.Book
if err := config.DB.First(&book, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Kitob topilmadi!"})
return
}
if err := c.ShouldBindJSON(&book); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
config.DB.Save(&book)
c.JSON(http.StatusOK, book)
}
func DeleteBook(c *gin.Context) {
id := c.Param("id")
if err := config.DB.Delete(&models.Book{}, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Kitob topilmadi!"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Kitob o‘chirildi!"})
}
6-qadam: API marshrutlarini sozlash
routes/routes.go
API marshrutlarini tashkil qilamiz:
package routes
import (
"golang-crud/controllers"
"github.com/gin-gonic/gin"
)
func SetupRoutes() *gin.Engine {
r := gin.Default()
r.GET("/books", controllers.GetBooks)
r.POST("/books", controllers.CreateBook)
r.GET("/books/:id", controllers.GetBookByID)
r.PUT("/books/:id", controllers.UpdateBook)
r.DELETE("/books/:id", controllers.DeleteBook)
return r
}
7-qadam: Loyiha ishga tushirish
main.go
Barcha qismlarni birlashtiramiz:
package main
import (
"golang-crud/config"
"golang-crud/routes"
)
func main() {
// Ma'lumotlar bazasini ulash
config.ConnectDatabase()
// Marshrutlarni sozlash
r := routes.SetupRoutes()
// Serverni ishga tushirish
r.Run(":8080")
}
8-qadam: Loyihani sinab ko‘rish
Serverni ishga tushirish uchun quyidagi buyruqni bering:
go run main.go
Va quyidagi marshrutlar bilan ishlang:
GET /books
– Barcha kitoblarni ko‘rishPOST /books
– Yangi kitob qo‘shishGET /books/:id
– ID bo‘yicha kitobni ko‘rishPUT /books/:id
– Kitobni yangilashDELETE /books/:id
– Kitobni o‘chirish