Go back

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‘rish
  • POST /books – Yangi kitob qo‘shish
  • GET /books/:id – ID bo‘yicha kitobni ko‘rish
  • PUT /books/:id – Kitobni yangilash
  • DELETE /books/:id – Kitobni o‘chirish

Share this post on: