Ответ
REST (Representational State Transfer) — это архитектурный стиль для создания масштабируемых и надежных веб-сервисов. Он не является протоколом, а скорее набором правил и ограничений для построения взаимодействия между клиентом и сервером.
Ключевые принципы REST:
- Клиент-серверная архитектура: Четкое разделение между клиентом (интерфейс) и сервером (данные и логика), что позволяет им развиваться независимо.
- Отсутствие состояния (Stateless): Каждый запрос от клиента должен содержать всю необходимую информацию для его выполнения. Сервер не хранит состояние клиента между запросами, что упрощает масштабирование.
- Кешируемость: Ответы от сервера должны явно помечаться как кешируемые или некешируемые. Это позволяет клиентам и промежуточным узлам (прокси) кешировать данные для улучшения производительности.
- Единообразный интерфейс (Uniform Interface): Это фундаментальный принцип, который включает:
- Идентификация ресурсов по URI: Каждый ресурс имеет уникальный идентификатор (например,
/users/123
). - Манипуляция ресурсами через представления: Клиент работает не с самим ресурсом, а с его представлением (например, в формате JSON).
- Использование стандартных HTTP-методов:
GET
(получить),POST
(создать),PUT
(обновить/заменить),DELETE
(удалить).
- Идентификация ресурсов по URI: Каждый ресурс имеет уникальный идентификатор (например,
Пример простого REST-like API на Go с net/http
:
package main
import (
"encoding/json"
"net/http"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
// Обработчик для получения списка пользователей
func usersHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet {
users := []User{{ID: 1, Name: "Alice"}, {ID: 2, Name: "Bob"}}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
}
}
func main() {
http.HandleFunc("/users", usersHandler)
http.ListenAndServe(":8080", nil)
}