bacen / pix-api

API Pix: a API do Arranjo de Pagamentos Instantâneos Brasileiro, Pix, criado pelo Banco Central do Brasil.
https://bacen.github.io/pix-api
2.31k stars 262 forks source link

[PROBLEMA] - PayloadLocation - GET /loc/{id} - Request aceita identificador do tipo String porém retorno é do tipo Integer #286

Open jussaragranja opened 3 years ago

jussaragranja commented 3 years ago

Para o endpoint de consultar o location por ID o identificador do resquest é setado como String, porém, seu retorno é um Integer. (IMAGEM NO LINK ABAIXO) Caso seja enviado uma String o response é um erro interno, sem tratamento, e não há nenhum exemplo de tratamento de erros nas especificações para esse caso. Como o identificador do location sempre é numérico (endpoint POST salva apenas identificadores numéricos) o identificador nesse request do GET deveria ser também.

IMAGEM: PayloadLocation

renatofrota commented 3 years ago

Um path param (parâmetro enviado através do "caminho" absoluto da própria URL de requisição) é, por natureza, string (assim como a URL como um todo).

Como não há locations identificadas com strings que não possam ser representadas em forma de um inteiro, qualquer conteúdo passado no path param {id} que não possa ser interpretado como inteiro (ex: 123A), pode apenas retornar que não há cobrança para aquele id (PayloadLocationNaoEncontrado).

image

Opcionalmente, pode-se tratar como um erro "de requisição" e responder que a URL não atende ao schema predefinido (PayloadLocationConsultaInvalida).

image

sendo, neste caso em particular, este o erro:

image

Obs: comentário colaborativo, não sou do BACEN.

jussaragranja commented 3 years ago

Obrigada pela explicação @renatofrota, porém, você saberia me informar o porque de não ser queryParam? visto que o identificador sempre é salvo como inteiro, por isso o questionamento desse campo na requisição estar como String.

E mais uma coisa o retorno abaixo é do próprio Bacen certo?

{ "type": "https://pix.bcb.gov.br/api/v2/error/ErroInternoDoServidor", "title": "Erro Interno", "status": 500, "detail": "Condição inesperada ao processar requisição.", "correlationId": "2897852e-484882" }

Caso sim, o exemplo de erro citado por você não está sendo retornado quando enviamos caracteres nesse campo.

renatofrota commented 3 years ago

Erro 500 representa um erro interno qualquer do PSP (Prestador de Serviços de Pagamento) que está te oferecendo a API, que não pode processar sua transação no momento por alguma condição e que pode ou não ser relacionada à sua consulta em particular.

Se a conta tem um bloqueio, falta alguma validação, excedeu algum limite, etc. Veja logo no início da página: https://bacen.github.io/pix-api/

Quem poderá te responder o motivo específico do erro 500 é só o seu PSP.

-edit-

Se não for um bloqueio na conta mas uma indisponibilidade de algum sistema interno que impeça a recuperação da informação desejada ou execução do procedimento solicitado (de forma que o request em momento posterior volte a funcionar sem qualquer intervenção da sua parte), o mais correto seria o erro retornado pelo PSP ser 503 (ServicoIndisponivel), sempre que possível.

renatofrota commented 3 years ago

Quanto ao motivo de não ser query param: é mais natural que, em o elemento location tendo um identificador único (location <> id é uma relação 1:1) que ele seja um path param e não um query param.

jussaragranja commented 3 years ago

Acho que não fui clara o suficiente, estou testando o endpoint em si, e quando envio caracteres (ex.: letras) no parâmetro ID que é String (como você disse, é String porque é PathParam), mas quando envio as letras é retornado esse erro interno pelo bacen. porém, não vejo problema em mudar para queryParam com o tipo Integer, visto que no cadastro do location, apenas é cadastrado o tipo Integer.

E o erro 500 que anexei anteriormente é da api pix do bacen, estou enviando letras no campo identificador String, e o erro não é o que você citou em sua primeira resposta, e sim um erro interno sem nenhum tipo de tratamento.

renatofrota commented 3 years ago

Acho que não fui clara o suficiente, estou testando o endpoint em si, e quando envio caracteres (ex.: letras) no parâmetro ID que é String (como você disse, é String porque é PathParam), mas quando envio as letras é retornado esse erro interno pelo bacen. porém, não vejo problema em mudar para queryParam com o tipo Integer, visto que no cadastro do location, apenas é cadastrado o tipo Integer.

E o erro 500 que anexei anteriormente é da api pix do bacen, estou enviando letras no campo identificador String, e o erro não é o que você citou em sua primeira resposta, e sim um erro interno sem nenhum tipo de tratamento.

Se você está passando um conteúdo com letras (string que não pode ser convertida em inteiro) no local do {id}, significa que, de qualquer forma, você não iria receber de volta um location válido (já que só existem locations cujo {id} é inteiro). Então se retorna 400 ou 403 (que seria mais correto) ou 500, não é tão relevante assim para o seu propósito de identificar onde está o erro (afinal, você já sabe onde está o erro).

Além disso, a especificação da API (feita pelo BACEN) está certa. Quem está retornando o erro (o seu PSP) é que não está seguindo à risca. Então isso você deve reportar pro seu PSP - pois esse repositório é do BACEN e eles não tem o que mudar na especificação da API neste caso.

renatofrota commented 3 years ago

Em tempo, dúvida similar a respeito de path params serem String (e a validação do formato ser feita no processamento) foi levantada anteriormente aqui: https://github.com/bacen/pix-api/issues/264

Concordo com o ninrod. O path da URL é String por natureza. Não faz sentido listar que deve ser passado um int pois qualquer sistema sempre vai receber a URL requisitada em formato de String. Na prática, o path param {id} é uma string com regex ^\d+$ - só aceita números mas não deixa de ser uma string.

ninrod commented 3 years ago

@jussaragranja , o @renatofrota foi bastante preciso em suas colocações, não vejo muito o que eu poderia acrescentar à questão.