Home > Mobile >  Why is the header value not being read?
Why is the header value not being read?

Time:09-26

package middleware

import (
"fmt"

"github.com/labstack/echo/v4"
)

type _getData struct {
Token string `header:"Authorization"`
}

func TokenCheck(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
    a := new(_getData)
    c.Bind(a)
    fmt.Print(a)
    return next(c)
}
}

There is an authrozation value in the header, using bind to the echo framework, I want to know the authrozation value, but there is no returned value.

CodePudding user response:

BindHeaders was not called in Bind. The Source code:

func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) {
    if err := b.BindPathParams(c, i); err != nil {
        return err
    }
    // Issue #1670 - Query params are binded only for GET/DELETE and NOT for usual request with body (POST/PUT/PATCH)
    // Reasoning here is that parameters in query and bind destination struct could have UNEXPECTED matches and results due that.
    // i.e. is `&id=1&lang=en` from URL same as `{"id":100,"lang":"de"}` request body and which one should have priority when binding.
    // This HTTP method check restores pre v4.1.11 behavior and avoids different problems when query is mixed with body
    if c.Request().Method == http.MethodGet || c.Request().Method == http.MethodDelete {
        if err = b.BindQueryParams(c, i); err != nil {
            return err
        }
    }
    return b.BindBody(c, i)
}

You can get the value in the header in the following ways:

func TokenCheck(next echo.HandlerFunc) echo.HandlerFunc {
    b := &echo.DefaultBinder{}
    return func(c echo.Context) error {
        a := new(_getData)
        b.BindHeaders(c, a)
        fmt.Print(a)
        return next(c)
    }
}

Or:

token := c.Request().Header.Get("Authorization")
  • Related