Как написать HTTP-сервис на стандартной библиотеке Go?
- Как работает net/http?
- Что такое http.Handler?
Обработчик — всё, что реализует http.Handler (метод ServeHTTP(w, r)), чаще — функция func(w http.ResponseWriter, r *http.Request). Маршруты регистрируют в http.ServeMux; с Go 1.22 он понимает метод и параметры пути: mux.HandleFunc("GET /orders/{id}", h), параметр — r.PathValue("id"). JSON — encoding/json: json.NewDecoder(r.Body).Decode(&req) и json.NewEncoder(w).Encode(resp). Каждый запрос обрабатывается в своей горутине — общие данные защищают. Middleware — функция, оборачивающая Handler (логирование, авторизация).
- Контекст запроса — r.Context(): передавать в базу и внешние вызовы
- Код ответа — w.WriteHeader до записи тела
- Тестировать — httptest.NewRecorder и httptest.NewServer
А ещё Фреймворки (chi, gin, echo) удобны, но стандартной библиотеки часто хватает
Подробно
Пример:
mux := http.NewServeMux()
mux.HandleFunc("GET /orders/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
o, err := store.Get(r.Context(), id)
if errors.Is(err, ErrNotFound) {
http.Error(w, "not found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(o)
})
srv := &http.Server{Addr: ":8080", Handler: logging(mux)}
log.Fatal(srv.ListenAndServe())Что хотят услышать
- Handler и HandlerFunc.
- ServeMux с методами и параметрами (1.22).
- JSON и коды ответа.
- Горутина на запрос, контекст, middleware.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓http.Handler и ServeMux; каждый запрос — в своей горутине
- ✗net/http обрабатывает все запросы последовательно в одной горутине
- ✗Без стороннего фреймворка в Go нельзя написать HTTP-сервис
- ✗Код ответа можно задать через WriteHeader и после записи тела
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.