Ответ
В основе REST (Representational State Transfer) API лежат стандартные HTTP-методы, которые обычно сопоставляются с CRUD-операциями (Create, Read, Update, Delete).
Основные методы:
GET: Получение ресурса. Этот метод идемпотентен (повторные вызовы возвращают тот же результат) и безопасен (не изменяет состояние сервера).
- Пример:
GET /api/users/123
— получить данные пользователя с ID 123.
- Пример:
POST: Создание нового ресурса. Не является идемпотентным, так как повторные вызовы создадут несколько ресурсов.
- Пример:
POST /api/users
с телом запроса, содержащим данные нового пользователя.
- Пример:
PUT: Полное обновление существующего ресурса. Является идемпотентным: повторный вызов с теми же данными не изменит состояние.
- Пример:
PUT /api/users/123
с полным набором полей для обновления.
- Пример:
PATCH: Частичное обновление существующего ресурса. Не всегда является идемпотентным (зависит от логики операции).
- Пример:
PATCH /api/users/123
с телом, содержащим только изменяемые поля, например,{"email": "new@example.com"}
.
- Пример:
DELETE: Удаление ресурса. Идемпотентен: повторное удаление уже удаленного ресурса вернет тот же результат (например, ошибку 404).
- Пример:
DELETE /api/users/123
.
- Пример:
Пример простого роутера на Go с использованием стандартной библиотеки net/http
:
func usersHandler(w http.ResponseWriter, r *http.Request) {
// Здесь может быть логика для извлечения ID из URL, например /users/{id}
switch r.Method {
case http.MethodGet:
// Логика получения пользователя
w.WriteHeader(http.StatusOK)
w.Write([]byte("Getting a user..."))
case http.MethodPost:
// Логика создания пользователя
w.WriteHeader(http.StatusCreated)
w.Write([]byte("Creating a user..."))
case http.MethodPut:
// Логика полного обновления
w.WriteHeader(http.StatusOK)
w.Write([]byte("Updating a user..."))
case http.MethodDelete:
// Логика удаления
w.WriteHeader(http.StatusNoContent) // или http.StatusOK
w.Write([]byte("Deleting a user..."))
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
func main() {
http.HandleFunc("/api/users/", usersHandler)
http.ListenAndServe(":8080", nil)
}