Home >Backend Development >Golang >Fiber handler accepts request with wrong content type

Fiber handler accepts request with wrong content type

WBOY
WBOYforward
2024-02-10 23:51:081265browse

Fiber 处理程序接受错误内容类型的请求

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.

Question content

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?

Solution

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete