Código de status HTTP recomendado para resposta "limite do plano excedido"

24

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 reservado

  • Algo ainda menos padrão, como 423 Lockedimprovável, o usaremos para qualquer outra coisa no futuro

Outra opção é usar algo muito padrão, como 403mas 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.

shevron
fonte
1
Há HTTP 507 armazenamento insuficiente.
CodesInChaos
O RFC4331 pode ser relevante, trata-se de limites de cota para o WebDAV.
CodesInChaos
@CodesInChaos, este não deve ser um erro 5xx, e o armazenamento foi apenas um exemplo (o projeto real não se trata de armazenamento, na verdade, foi apenas uma boa analogia).
Shevron
O código de status de resposta HTTP 429 Too Many Requests indica que o usuário enviou muitas solicitações em um determinado período de tempo
ExtractTable.com

Respostas:

17

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:

O servidor entendeu a solicitação, mas está se recusando a atendê-la. A autorização não ajudará e a solicitação NÃO DEVE ser repetida. Se o método de solicitação não foi HEAD e o servidor deseja tornar público o motivo pelo qual a solicitação não foi atendida, DEVE descrever o motivo da recusa na entidade

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.

gbjbaanb
fonte
22

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.

gnasher729
fonte
1
402é uma opção, mas eu prefiro reserva 429para fins limitando taxa real que são susceptíveis de adicionar no futuro
Shevron
O Google parece usar,403 embora eu goste 429muito melhor. Eu já vi algumas implementações personalizadas de clientes http que fizeram algumas coisas estranhas 401e 403(por exemplo, um site desconectaria o usuário se obtivesse 401 ou 403 da API).
Cristian Vrabie
0

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.

CodesInChaos
fonte
12
Parece contra-intuitivo usar um código 5xx para isso.
Ben Aaronson