Чтобы написать простой REST API на Go, вы можете использовать встроенный пакет net/http. Вот пример простого HTTP-сервера, который прослушивает порт 8080 и возвращает «Hello, World!» сообщение при выполнении запроса GET к корневой конечной точке /:

package main

import (
 "fmt"
 "net/http"
)

func main() {
 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  fmt.Fprint(w, "Hello, World!")
 })

 http.ListenAndServe(":8080", nil)
}

В этом примере мы сначала импортируем необходимые пакеты: fmt для форматирования строк и net/http для обработки HTTP-запросов и ответов.

Затем мы определяем функцию-обработчик для корневой конечной точки /. Функция http.HandleFunc() принимает два аргумента: путь URL для сопоставления и функцию-обработчик, которая выполняется при совпадении пути. В этом случае мы используем анонимную функцию в качестве функции-обработчика, которая принимает два аргумента: w http.ResponseWriter и r *http.Request. Аргумент w — это объект http.ResponseWriter, который мы используем для записи ответа обратно клиенту, а аргумент r — это указатель на объект http.Request, содержащий информацию о входящем запросе.

Внутри функции-обработчика мы используем функцию fmt.Fprint() для записи «Hello, World!» сообщение автору ответа (w).

Наконец, мы используем функцию http.ListenAndServe() для запуска HTTP-сервера и прослушивания входящих запросов на порту 8080. Второй аргумент http.ListenAndServe() — это обработчик, который следует использовать для обработки входящих запросов. Поскольку мы используем http.HandleFunc() для регистрации нашей функции-обработчика, мы можем передать nil в качестве второго аргумента.

Теперь, когда мы узнали, как создать базовый REST API в Go, давайте углубимся и изучим, как реализовать операции CRUD с помощью стороннего пакета github.com/gorilla/mux.

github.com/gorilla/mux — это популярный сторонний пакет для Go, предоставляющий мощный и гибкий маршрутизатор для создания веб-приложений. Он легко настраивается и позволяет легко внедрять промежуточное ПО, маршрутизацию и обработчики HTTP. Одним из основных преимуществ использования mux является его способность обрабатывать сложные шаблоны сопоставления URL-адресов и маршрутизации, что делает его предпочтительным выбором для создания RESTful API. Кроме того, mux предлагает такие функции, как подмаршрутизация, сопоставление регулярных выражений и параметры URL-адреса на основе пути, которые могут упростить и повысить эффективность разработки.

package main

import (
 "encoding/json"
 "fmt"
 "log"
 "net/http"
 "strconv"

 "github.com/gorilla/mux"
)

type Item struct {
 ID    int    `json:"id"`
 Name  string `json:"name"`
 Price int    `json:"price"`
}

var items []Item

func main() {
 router := mux.NewRouter()

 // Define the endpoints for CRUD operations
 router.HandleFunc("/items", getItems).Methods("GET")
 router.HandleFunc("/items/{id}", getItem).Methods("GET")
 router.HandleFunc("/items", createItem).Methods("POST")
 router.HandleFunc("/items/{id}", updateItem).Methods("PUT")
 router.HandleFunc("/items/{id}", deleteItem).Methods("DELETE")

 // Start the HTTP server
 log.Fatal(http.ListenAndServe(":8080", router))
}

func getItems(w http.ResponseWriter, r *http.Request) {
 json.NewEncoder(w).Encode(items)
}

func getItem(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)

 id, err := strconv.Atoi(params["id"])
 if err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
 }

 for _, item := range items {
  if item.ID == id {
   json.NewEncoder(w).Encode(item)
   return
  }
 }

 http.NotFound(w, r)
}

func createItem(w http.ResponseWriter, r *http.Request) {
 var item Item
 err := json.NewDecoder(r.Body).Decode(&item)
 if err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
 }

 item.ID = len(items) + 1
 items = append(items, item)

 json.NewEncoder(w).Encode(item)
}

func updateItem(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)

 id, err := strconv.Atoi(params["id"])
 if err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
 }

 var updatedItem Item
 err = json.NewDecoder(r.Body).Decode(&updatedItem)
 if err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
 }

 for i, item := range items {
  if item.ID == id {
   items[i] = updatedItem
   json.NewEncoder(w).Encode(updatedItem)
   return
  }
 }

 http.NotFound(w, r)
}

func deleteItem(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)

 id, err := strconv.Atoi(params["id"])
 if err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
 }

 for i, item := range items {
  if item.ID == id {
   items = append(items[:i], items[i+1:]...)
   w.WriteHeader(http.StatusNoContent)
   return
  }
 }

 http.NotFound(w, r)
}

В этом примере мы сначала импортируем пакет encoding/json для кодирования и декодирования JSON и пакет github.com/gorilla/mux для маршрутизации запросов.

Затем мы определяем структуру Item для представления предмета в нашем инвентаре и срез Item для хранения всех предметов.

Затем мы определяем функцию main(), в которой мы создаем новый маршрутизатор, используя mux.NewRouter(). Затем мы определяем конечные точки для операций CRUD, используя router.HandleFunc(), и передаем соответствующие функции обработчика. Каждая функция-обработчик отвечает за выполнение соответствующей операции CRUD над нашим фрагментом элементов.

В функциях-обработчиках getItems() и getItem() мы используем `json.NewEncoder

Вы можете заметить частое использование mux.Vars(r). Это связано с тем, что mux.Vars(r) используется для извлечения параметров URL из HTTP-запроса в веб-приложении Go с использованием маршрутизатора «gorilla/mux». mux.Vars(r) — это функция, предоставляемая пакетом «gorilla/mux» в Go, которая возвращает карту URL-адресов. параметры, извлеченные из запроса.

В REST API параметры могут передаваться на сервер через URL-адрес, а mux.Vars(r) позволяет извлекать эти параметры из объекта запроса (r) с помощью маршрутизатора gorilla/mux.

Например, если у вас есть шаблон URL-адреса /users/{id}, который соответствует запросам на получение определенного пользователя по идентификатору, вы можете использовать mux.Vars(r) для извлечения параметра id из URL-адреса запроса.

В Go пакет json предоставляет две важные структуры для кодирования и декодирования данных JSON: json.Decoder и json.Encoder.

Функции json.NewDecoder() и json.NewEncoder() возвращают новый декодер и энкодер соответственно. Эти структуры позволяют кодировать и декодировать данные JSON в типы данных Go, такие как структуры или карты, и из них.

Вот краткое объяснение каждой из этих структур:

  • json.NewDecoder(r.Body) создает новый декодер JSON, который считывает данные из заданного r.Body io.Reader и позволяет анализировать из него данные JSON. Вы можете использовать метод Decode() в декодере для анализа данных JSON в тип данных Go, например структуру или карту.
  • json.NewEncoder(w) создает новый кодировщик JSON, который записывает в заданный w io.Writer и позволяет кодировать тип данных Go в формат JSON. Вы можете использовать метод Encode() в кодировщике, чтобы закодировать тип данных Go в формат JSON и записать его в файл io.Writer.

Если вы найдете эту информацию полезной, поддержите меня и следите за обновлениями.🙂