Áttekintés
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 aHTTP_EXPOSE_INTERNAL_ERRORShogyan illeszkedik ide. - Validáció: a
httperr/validatecsomag, aTranslate, é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.