1
resposta

Requisição no Postman sem retorno quando utilizado chave 'Accept' com valor inválido (Aula 5.2)

Na aula 5.2 é implementado a validação do cabeçalho através da chave Accept. Neste caso, quando eu tento realizar a requisição no Postman sem informar a chave Accept ou informando-a com o valor correto application/json, eu recebo o retorno corretamente. No entanto, se eu informar o valor application/xml, o Postman fica em um loop sem retornar o status 406:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obs: No terminal do VSCode não apresenta nenhum erro.

Já vi e revi o video da aula e não localizo o erro. Eu continuei o curso pois pensei que fosse algo temporário, mas não está resolvendo, portanto o meu código já está com as aulas seguintes. De qualquer forma, segue para confirmação de que o mesmo está de acordo com a aula apresentada:

Serializador.js:

const ValorNaoSuportado = require('./erros/ValorNaoSuportado')

class Serializador {
    json (dados) {
        return JSON.stringify(dados)
    }
    serializar (dados) {
        if (this.contentType === 'application/json') {
            return this.json(
                this.filtrar(dados)
            )
        }

        throw new ValorNaoSuportado(this.contentType)

    }

    filtrarObjeto (dados) {
        const novoObjeto = {}
        this.camposPublicos.forEach((campo) => {
            if (dados.hasOwnProperty(campo)) {
                novoObjeto[campo] = dados[campo]
            }
        })
        return novoObjeto
    }

    filtrar (dados) {
        if (Array.isArray(dados)) {
            dados = dados.map(item => { 
                return this.filtrarObjeto(item)
            })
        } else {
            dados = this.filtrarObjeto(dados)
        }

        return dados
    }
}


class SerializadorFornecedor extends Serializador {
    constructor(contentType) {
        super()
        this.contentType = contentType
        this.camposPublicos = [
            'id', 
            'empresa', 
            'categoria']

    }
}

module.exports = {
    Serializador: Serializador,
    SerializadorFornecedor: SerializadorFornecedor,
    formatosAceitos: ['application/json']
}

Index.js:

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const config = require('config')
const NaoEncontrado = require('./erros/NaoEncontrado')
const CampoInvalido = require('./erros/CampoInvalido')
const DadosNaoFornecidos = require('./erros/DadosNaoFornecidos')
const ValorNaoSuportado = require('./erros/ValorNaoSuportado')
const formatosAceitos = require('./Serializador').formatosAceitos

//app.use(bodyParser.json())
app.use(express.json())
app.use(express.urlencoded({ extended: true}))

app.use((requisicao, resposta, proximo) => {
    let formatoRequisitado = requisicao.header('Accept')

    if (formatoRequisitado === '*/*') {
        formatoRequisitado = 'application/json'
    }

    if (formatosAceitos.indexOf(formatoRequisitado) === -1) {
        resposta.status(406)
        resposta.end
        return
    }

    resposta.setHeader('Content-Type', formatoRequisitado)
    proximo()

})

const roteador = require('./rotas/fornecedores')
app.use('/api/fornecedores', roteador)

app.use((erro, requisicao, resposta, proximo) => {
    let status = 500

    if (erro instanceof NaoEncontrado) {
        status = 404
    }
    if (erro instanceof CampoInvalido || erro instanceof DadosNaoFornecidos) {
        status = 400
    }
    if (erro instanceof ValorNaoSuportado) {
        status = 406
    }

    resposta.status(status)
    resposta.send(
        JSON.stringify ({
            mensagem: erro.message,
            id: erro.idErro
        })
    )

})

app.listen(config.get('api.porta'), () => console.log('A API está funcionando!'))

Alguém pode me dar um help para entender o que está passando batido por mim? Obrigado desde já.

1 resposta

Boa tarde Gabriel, tudo certo?

Pelo que estou vendo do seu projeto, realmente todos os códigos que você enviou aqui estão bem próximos do projeto feito durante o curso. Você poderia subir o projeto completo no GitHub e compartilhar o link conosco para que possamos investigar mais o que está acontecendo?

Eu tenho a suspeita que talvez haja alguma diferença na hora de chamar os serializadores no arquivo api/rotas/fornecedores/index.js. Caso queira conferir, recomendo dar uma olhada nesse link do projeto no GitHub.

Qualquer coisa estou no aguardo. Bons estudos!