Расскажите о своем опыте проектирования и разработки REST API на Go.

Ответ

Да, разработка REST API — одна из моих ключевых компетенций в Go. Я имею опыт как в создании API с нуля, так и в работе с существующими.

Создание REST API (Серверная часть)

В основе любого веб-сервиса на Go лежит стандартный пакет net/http. Для более сложных задач, таких как маршрутизация и middleware, я использую популярные роутеры, например, chi или gorilla/mux, так как они предоставляют гибкость, не усложняя приложение.

Пример простого HTTP-хендлера:

func GetItemsHandler(w http.ResponseWriter, r *http.Request) {
    // Логика получения данных
    items := []string{"item1", "item2"}

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(items)
}

func main() {
    r := chi.NewRouter()
    r.Get("/items", GetItemsHandler)
    http.ListenAndServe(":8080", r)
}

Взаимодействие с REST API (Клиентская часть)

Для отправки запросов к внешним API я также использую стандартный пакет net/http, так как он мощный и не требует внешних зависимостей для большинства задач.

Пример POST-запроса:

func postData() {
    jsonData := map[string]string{"firstName": "John", "lastName": "Doe"}
    jsonValue, _ := json.Marshal(jsonData)

    req, _ := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonValue))
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalf("Request failed: %s", err)
    }
    defer resp.Body.Close()
}

Принципы проектирования API

При проектировании API я придерживаюсь следующих принципов:

  • Четкое использование HTTP-методов: GET для получения, POST для создания, PUT/PATCH для обновления, DELETE для удаления.
  • Правильные коды состояния HTTP: 200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error и т.д.
  • Версионирование API: Например, через URL (/api/v1/...).
  • Единообразные и предсказуемые ответы: Структурированный JSON для успешных ответов и ошибок.