httperr

Áttekintés

RFC 9457 problem details HTTP handlerekhez.

A httperr önálló Go modul (github.com/gp-system/httperr): a gpsystem hibamodell drót felé néző oldala, ami egy Go hibát RFC 9457 problem+json HTTP-válasszá alakít. Függősége a gp-system/errs (egy felépített hiba kódjának, publikus üzenetének és státuszának olvasásához) és a go-playground/validator (a httperr/validate alcsomagon keresztül, hogy a struct-tag validációs bukásokat ugyanerre a formára alakítsa). Sima net/http-vel működik: keretrendszer nem szükséges. Az általa renderelt hibák felépítése az errs dolga, ezt a Hibamodell oldal írja le; ez az oldal és a következő kettő a renderelést fedi le.

Telepítés

go get github.com/gp-system/httperr@v0.1.0 # a kit is ezt a taget használja
go get github.com/gp-system/httperr@latest

Go 1.25+. Függőségek: github.com/gp-system/errs és github.com/go-playground/validator/v10 (csak akkor húzódik be tranzitívan, ha a httperr/validate-et importálod; az alap httperr csomagnak csak az errs kell).

A Problem típus

import "github.com/gp-system/httperr"

type Problem struct {
    Type     string       `json:"type"`
    Title    string       `json:"title"`
    Status   int          `json:"status"`
    Detail   string       `json:"detail,omitempty"`
    Instance string       `json:"instance,omitempty"`
    Code     string       `json:"code,omitempty"`
    Errors   []FieldError `json:"errors,omitempty"`
}

type FieldError struct {
    Field   string `json:"field"`
    Rule    string `json:"rule,omitempty"`
    Message string `json:"message"`
}

A Problem implementálja az error-t, tehát felépítheted és közvetlenül return-ölheted egy handlerből, mint bármely más hibát; a következő oldal írja le, hogy ez (és minden más hiba) valójában hogyan ér a HTTP-válaszba. Egy kidolgozott, teljes példa:

if productID == "" {
    return httperr.BadRequest("productId is required")
}
{
  "type": "about:blank",
  "title": "Bad Request",
  "status": 400,
  "detail": "productId is required"
}

Konstruktorok

httperr.New(status, title, detail) // a title defaultja a HTTP státusz-szöveg
httperr.BadRequest(detail)         // 400
httperr.Unauthorized(detail)       // 401
httperr.Forbidden(detail)          // 403
httperr.NotFound(detail)           // 404
httperr.Conflict(detail)           // 409
httperr.Internal(detail)           // 500
httperr.Validation(fieldErrs...)   // 422, errors[]-szel

Ezek jól fedik a gyors, névtelen 4xx-eket: a return httperr.NotFound("no such product") egy handlerben így, önmagában is teljesen rendben van. Amint egy hibamódnak neve, stabil kódja vagy több hívási helye van, az errs.Define a jobb otthon: a felismerés (errors.Is) és a renderelés (státusz, kód, üzenet) így egyetlen deklarációban él, nem szétszórt httperr.___(...) hívásokban, és a mapping ugyanúgy felveszi.

Kapcsolódó oldalak

  • Hibaválaszok: WriteError/NewWriteError, a teljes mapping-sorrend, és hogy a HTTP_EXPOSE_INTERNAL_ERRORS hogyan illeszkedik ide.
  • Validáció: a httperr/validate csomag, a Translate, és a 422-es válaszforma.
  • errs: Áttekintés: a modul, ami a httperr által renderelt hibákat felépíti.
  • Hibamodell: a teljes kérés-válasz pipeline.
Copyright © 2026