package
0.0.0-20241212234551-d1328d747c9a
Repository: https://github.com/leetmansup/techsoftwarecreating.git
Documentation: pkg.go.dev

# README

Практическая работа №7. REST API

Установка зависимостей (Gin и Swag и Middleware для Swagger)

go get -u github.com/gin-gonic/gin
go install github.com/swaggo/swag/cmd/swag@latest
go get -u github.com/swaggo/http-swagger

Структура проекта

alt text


Содержимое файла main.go

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/swaggo/http-swagger"
	"log"
	"net/http"
	_ "restApi/docs"
)

type Good struct {
	ID          string  `json:"id" example:"1"`
	Name        string  `json:"name" example:"Стол"`
	Description string  `json:"description" example:"Обычный деревянный стол"`
	Price       float32 `json:"price" example:"10000.0"`
}

type ErrorResponse struct {
	Error string `json:"error" example:"id not found"`
}

var goods = []Good{
	{
		ID:          "1",
		Name:        "Стол",
		Description: "Обычный деревянный стол",
		Price:       10000.0,
	},
	{
		ID:          "2",
		Name:        "Стул",
		Description: "Обычный железный стул",
		Price:       3000.0,
	},
	{
		ID:          "3",
		Name:        "Ковёр",
		Description: "Красный совковый ковёр",
		Price:       5000.0,
	},
}

// @Summary Получить все товары
// @Description Возвращает список всех товаров
// @Tags goods
// @Produce json
// @Success 200 {array} Good
// @Router /goods [get]
func getGoods(c *gin.Context) {
	c.JSON(http.StatusOK, goods)
}

// @Summary Получить товар по ID
// @Description Возвращает информацию о товаре по его ID
// @Tags goods
// @Produce json
// @Param id path string true "ID товара"
// @Success 200 {object} Good
// @Failure 404 {object} ErrorResponse
// @Router /goods/{id} [get]
func getGood(c *gin.Context) {
	id := c.Param("id")

	for _, good := range goods {
		if good.ID == id {
			c.JSON(http.StatusOK, good)
			return
		}
	}
	c.JSON(http.StatusNotFound, ErrorResponse{Error: "id not found"})
}

// @Summary Создать новый товар
// @Description Добавляет новый товар в список
// @Tags goods
// @Accept json
// @Produce json
// @Param good body Good true "Информация о товаре"
// @Success 201 {object} Good
// @Failure 400 {object} ErrorResponse
// @Router /goods [post]
func createGood(c *gin.Context) {
	var newGood Good

	if err := c.ShouldBind(&newGood); err != nil {
		c.JSON(http.StatusBadRequest, ErrorResponse{Error: err.Error()})
		return
	}

	goods = append(goods, newGood)
	c.JSON(http.StatusCreated, newGood)
}

// @Summary Обновить существующий товар
// @Description Обновляет данные товара по ID
// @Tags goods
// @Accept json
// @Produce json
// @Param id path string true "ID товара"
// @Param good body Good true "Новые данные товара"
// @Success 200 {object} Good
// @Failure 400 {object} ErrorResponse
// @Failure 404 {object} ErrorResponse
// @Router /goods/{id} [put]
func updateGood(c *gin.Context) {
	id := c.Param("id")
	var updatedGood Good

	if err := c.ShouldBind(&updatedGood); err != nil {
		c.JSON(http.StatusBadRequest, ErrorResponse{Error: err.Error()})
		return
	}

	for i, good := range goods {
		if good.ID == id {
			goods[i] = updatedGood
			c.JSON(http.StatusOK, updatedGood)
			return
		}
	}
	c.JSON(http.StatusNotFound, ErrorResponse{Error: "id not found"})
}

// @Summary Удалить товар
// @Description Удаляет товар по ID
// @Tags goods
// @Produce json
// @Param id path string true "ID товара"
// @Success 200 {object} Good
// @Failure 404 {object} ErrorResponse
// @Router /goods/{id} [delete]
func deleteGood(c *gin.Context) {
	id := c.Param("id")

	for i, good := range goods {
		if good.ID == id {
			goods = append(goods[:i], goods[i+1:]...)
			c.JSON(http.StatusOK, good)
			return
		}
	}
	c.JSON(http.StatusNotFound, ErrorResponse{Error: "id not found"})
}

func main() {
	router := gin.Default()

	// Получение всех товаров
	router.GET("/goods", getGoods)

	// Получение товара по ID
	router.GET("/goods/:id", getGood)

	// Создание нового товара
	router.POST("/goods", createGood)

	// Обновление существующего товара
	router.PUT("/goods/:id", updateGood)

	// Удаление товара
	router.DELETE("/goods/:id", deleteGood)

	http.HandleFunc("/swagger/", httpSwagger.WrapHandler)
	log.Fatal(http.ListenAndServe(":8888", nil))
	router.Run(":8888")
}

Проверка обработки запросов через Postman

GET (/goods) - получение списка товаров

alt text

GET (/goods/:id) - получение товара по ID

alt text

POST (/goods) - создание нового товара

alt text Проверка создания alt text

PUT (/goods/:id) - обновление существующего товара

alt text Проверка обновления alt text

DELETE (/goods/:id) - удаление товара

alt text Проверка удаления товара alt text


Документация на Swagger

Генерируется по команде

swag init

Доступна по ссылке, если проект запущен на локальном хосте: http://localhost:8080/swagger/index.html#/

Список

alt text

Эндпоинты

alt text

alt text

alt text

alt text

alt text

Структуры

alt text

# Structs

No description provided by the author
No description provided by the author