Estou projetando uma API REST para um projeto em que os usuários estão sempre em um dos vários "planos" - cada plano define alguns limites de recursos, como o número máximo de usuários que uma conta pode ter ou o número máximo de dados que eles podem carregar. Quando um desses limites é atingido, os usuários podem atualizar seus planos (essencialmente pagam) para obter mais recursos.
Desejo retornar um código de status especial indicando uma situação em que a ação não pode ser executada devido aos limites de recursos da conta e a atualização do plano resolverá isso - por exemplo, se um usuário usar 100% de sua capacidade de armazenamento e tentar fazer upload de um arquivo adicional , eles receberão esta resposta.
Os candidatos são, IMHO:
403 Forbidden
- no entanto, gostaria de distinguir entre este e outros casos em que o usuário simplesmente não tem permissão para executar esta ação.401 Unauthorized
- não é uma boa ideia, estamos usando isso para problemas relacionados à autenticação.402 Payment Required
- faz algum sentido, mas estou preocupado em usar um código de status não padronizado, mas reservadoAlgo ainda menos padrão, como
423 Locked
improvável, o usaremos para qualquer outra coisa no futuro
Outra opção é usar algo muito padrão, como 403
mas indicar as especificidades do erro no corpo da resposta.
Estou imaginando qual abordagem você acredita que (a) funcionaria melhor a longo prazo e (b) se manteria mais bem nos princípios RESTful.
fonte
Respostas:
Penso que 403 é a única resposta razoável, embora o Método 405 não permitido ou o Conflito 409 possam ser aceitáveis, acho que também não são tão bons quanto 403, que afirma:
Se você retornar um erro 403, incluirá algumas informações sobre por que o recurso foi negado - permissão inválida é apenas o caso mais comum, limites excedidos não são muito diferentes - você não tem permissão porque seu limite foi excedido.
fonte
Acredito que 403 esteja errado, porque 403 é para situações em que você não está obtendo acesso ao recurso e não há como acessar. Para seus clientes, obviamente existe uma maneira de obter acesso: Pague.
401 está realmente errado, porque você não está apenas usando-o para autenticação, mas é para isso que ele existe.
Como você está escrevendo uma API, presumo que outra pessoa precise escrever um código que use a API e essa pessoa precise ler suas especificações. Você pode ir com 429 "Solicitações em excesso". Ele geralmente se destina à limitação de taxa (onde um cliente pode fazer 100 solicitações por dia, por exemplo), mas se aplica razoavelmente à sua situação. 402 (Pagamento obrigatório) também seria aceitável, eu acho. Depende de quais ferramentas você espera que as pessoas usem para usar sua API. 429 corre o risco de que uma ferramenta inteligente tente enviar menos solicitações por minuto / hora / dia e nunca tenha êxito.
Entre https://tools.ietf.org/html/rfc6585, o erro 429 também deve conter uma mensagem html descrevendo a natureza do problema, para que haja uma boa chance de que o usuário seja informado sobre qual é o problema, se você fornecer essa informação na sua resposta.
fonte
402
é uma opção, mas eu prefiro reserva429
para fins limitando taxa real que são susceptíveis de adicionar no futuro403
embora eu goste429
muito melhor. Eu já vi algumas implementações personalizadas de clientes http que fizeram algumas coisas estranhas401
e403
(por exemplo, um site desconectaria o usuário se obtivesse 401 ou 403 da API).O WebDAV usa HTTP 507 Insufficient Storage para isso e inclui um código de erro adicional para cota excedida no corpo da solicitação, para distingui-lo de outros tipos de limitações de armazenamento.
fonte