Расскажите о вашем опыте работы с HTTP в Go

Ответ

Да, HTTP — это основа моей работы в бэкенд-разработке на Go. Я глубоко понимаю как сам протокол, так и его реализацию в стандартной библиотеке Go.

1. Понимание протокола HTTP:

  • Методы: GET, POST, PUT, PATCH, DELETE и их идемпотентность.
  • Статус-коды: Понимаю семантику основных групп (1xx, 2xx, 3xx, 4xx, 5xx).
  • Заголовки (Headers): Content-Type, Authorization, Cache-Control и другие.
  • Тело запроса/ответа (Body): Работа с различными форматами, в основном JSON.

2. Стандартная библиотека net/http: Я активно использую пакет net/http для создания как серверов, так и клиентов.

  • Пример HTTP-сервера:

    package main
    
    import (
        "fmt"
        "log"
        "net/http"
    )
    
    func helloHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    }
    
    func main() {
        http.HandleFunc("/hello", helloHandler)
        log.Println("Starting server on :8080")
        if err := http.ListenAndServe(":8080", nil); err != nil {
            log.Fatal(err)
        }
    }
  • Пример HTTP-клиента:

    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Get("https://example.com")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))

3. Практические задачи и инструменты:

  • Роутинг: Использовал как стандартный http.ServeMux, так и более производительные роутеры, например, chi или gorilla/mux.
  • Middleware: Писал и использовал middleware для логирования, аутентификации (JWT), сбора метрик и обработки паник.
  • Работа с данными: Декодирование JSON в структуры, обработка форм, загрузка файлов.
  • Архитектурные стили: Проектировал и разрабатывал RESTful API. Также имею опыт работы с gRPC, который часто использует HTTP/2 в качестве транспорта.