Gin: Como interromper um middleware e obter uma resposta imediata?

Criado em 28 mar. 2017  ·  3Comentários  ·  Fonte: gin-gonic/gin

estou tentando escrever um middleware de analisador de corpo. por design, o middleware retornará imediatamente se um error ocorrer quando houver falha na decodificação de json. mas o middleware agiu assim, ignorou a instrução return e foi para o próximo manipulador.

package middleware

import (
    "github.com/gin-gonic/gin"
    "encoding/json"
    "net/http"
)

func BodyParser() gin.HandlerFunc {
    return func(c *gin.Context) {
        var m map[string]interface{}

        decoder := json.NewDecoder(c.Request.Body)

        defer c.Request.Body.Close()

        if err := decoder.Decode(&m); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": "invalid body"})
            return
        }

        c.Set("body", m)
        c.Next()
    }
}

Comentários muito úteis

@ dheeraj2dj Experimente com

ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Unauthorized"})

Isso funciona!

Todos 3 comentários

use Abort antes de return

@sofish Como funcionou para você? A seguir está o meu trecho de código, mas não consigo fazê-lo funcionar. Não aborta.

c.Header("WWW-Authenticate", "Basic realm=\"Authorization Required\"")
c.JSON(http.StatusUnauthorized, gin.H{"Message": "Unauthorized"})
c.Abort()
return

Recebendo este erro: [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 401 with 200

@ dheeraj2dj Experimente com

ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Unauthorized"})

Isso funciona!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rawoke083 picture rawoke083  ·  3Comentários

iiinsomnia picture iiinsomnia  ·  3Comentários

oryband picture oryband  ·  3Comentários

olegsobchuk picture olegsobchuk  ·  3Comentários

wangcn picture wangcn  ·  3Comentários