Fiber is an efficient PHP extension that can be used to build asynchronous, coroutine and concurrent applications. Its handlers can accept requests with various error content types, such as JSON, XML, etc. With Fiber, developers can more flexibly handle requests in different formats and handle errors accordingly. This enables developers to better manage and maintain their applications, improving code robustness and maintainability. In this article, we'll take a deep dive into how Fiber handles different types of request errors and provide useful advice and tips for developers.
I am building a simple restful api using fiber 2.44.0
and go 1.20
. I'm currently testing if I can enforce what's acceptable for a given handler (a very common thing), but it looks like I'm doing something wrong, or fibre.ctx.accepts
doesn't quite follow Works the way I expect.
This is a very simple route that I defined. Note the usage of ctx.accepts
... but it doesn't matter what accept
http header I use, all requests will go through.
// app.go func main() { config := fiber.Config{ StrictRouting: true, } app := fiber.New(config) app.Use(logger.New(), recover.New()) app.Get("/", handlers.RootHandler) log.Fatal(app.Listen(":8080")) } // ============================================================================ // handlers/handlers.go func RootHandler(ctx *fiber.Ctx) error { ctx.Accepts(fiber.MIMETextPlain, fiber.MIMETextPlainCharsetUTF8) ctx.Set(fiber.HeaderContentType, ctx.GetReqHeaders()[fiber.HeaderAccept]) return ctx.Status(fiber.StatusOK).SendString("Hello, world!") }
Is there a way to avoid this behavior and configure the handler/routing correctly?
The signature of this function is:
func (c *ctx) accepts(offers ...string) string
It will return the quotes that are acceptable among the quotes you passed to this function. If the accept
header in the request does not match any of the offers, it will return an empty string (see Implementation). So if you want to force a given handler to accept something acceptable, you can simply check if the return value is an empty string:
func RootHandler(ctx *fiber.Ctx) error { if offer := ctx.Accepts(fiber.MIMETextPlain, fiber.MIMETextPlainCharsetUTF8); offer == "" { return ctx.SendStatus(fiber.StatusNotAcceptable) } // ... }
The above is the detailed content of Fiber handler accepts request with wrong content type. For more information, please follow other related articles on the PHP Chinese website!