Qual deve ser o código de status http para o erro "Serviço não disponível em sua área"?

51

Nosso serviço está em 5 cidades no momento. Se alguém tentar chamar nossa API de serviço de qualquer outra cidade, queremos lançar esse erro Service not available in your area.

A questão é: qual seria o código http apropriado para esse erro?

  • 503 serviço indisponível
  • 403: Proibido

ou alguma outra coisa?

Shaharyar
fonte
52
"Se alguém tentar ligar para a nossa API de serviço de qualquer outra cidade", observe que a geolocalização de IP geralmente está incorreta; se você proibir qualquer usuário cujo IP seja geolocalizado em uma cidade diferente, provavelmente estará bloqueando usuários legítimos.
Peter Green
43
Não posso pegar carona para meu filho, que está em outra cidade e precisa ir ao aeroporto para me visitar?
Dawood diz que restabelece Monica
29
Embora não seja uma resposta para a pergunta, o HTTP 451 (RFC 7725) pode ser útil para futuros leitores que encontrarem essa pergunta. Sua principal finalidade é indicar conteúdo não está disponível devido a uma jurídica do pedido, ação ou restrição (copyright, ordem judicial, etc.)
Tyzoid
34
Se não houver nada de errado com a conectividade de rede, autenticação, nenhum erro internamente no aplicativo e entrada sintaticamente válida, não deve haver uma mensagem de erro. Com "nós não oferecemos nosso serviço nesta área", você deixou problemas de tecnologia e entrou em problemas de negócios; portanto, não tenho certeza se um erro HTTP seria apropriado. Eu acho que você deveria dar 200 e (ou 302 e redirecionar para) uma mensagem apropriada sobre "desculpe, nosso serviço ainda não está disponível em sua área. Ainda estamos expandindo - Volte no final de 2019!" ou qualquer que seja o departamento de marketing.
21418 ivanivan
7
Não está claro se você pretende bloquear todo o acesso à API com base na localização do computador cliente (IP geográfico?) Ou se está solicitando o código de resposta para uma solicitação de API com falha específica (por exemplo, book? Address = 123_example_st_london) . O local faz parte da entrada ou você tem o local do cliente de outra maneira?
Ben

Respostas:

101

Qualquer código de erro HTTP seria inapropriado. Não há nenhum erro ou problema de qualquer tipo na perspectiva HTTP, portanto deve ser algo no intervalo 200. Você informa educadamente alguns de seus usuários que eles não serão atendidos enviando de volta um documento que os informa. E tudo isso vai bem.

O usuário não poderá usar seu aplicativo . Essa é uma decisão consciente tomada pela lógica de negócios, não um acidente. No nível HTTP, tudo é honky dory.

Editar

Parece que o que estamos vendo aqui é um choque entre a velha escola e a nova escola. Quando o HTTP foi projetado, não havia serviços da Web, não havia princípios SOAP, JSON ou REST. Como um protocolo acima do TCP, isso já era considerado (próximo) ao nível do aplicativo e muitos códigos de status de alto nível foram definidos. Quando a Web começou a ser usada para serviços mais sofisticados e de alto nível e um meio comum de transportar "envelopes" era necessária, os designers fizeram o upload do HTTP, em vez de definir um protocolo mais novo e limpo, apenas porque o HTTP era onipresente.

Portanto, em um contexto moderno de serviço da web, o HTTP é realmente pouco mais que uma camada de transporte idiota e a maioria de seus códigos pode ser considerada não aplicável ou obsoleta. Basta escolher um porque ele se aproxima do estado do aplicativo e está nessa lista que antes significava que algo pode parecer inofensivo, mas acho que enviaria uma mensagem errada. Você não deseja que o HTTP desempenhe essa função reguladora em um contexto de serviço da web.

Martin Maat
fonte
56
Por essa lógica, qualquer erro de aplicativo deve ser retornado como 200. E todas as solicitações devem ser POST, mesmo exclusões. Essa abordagem trata o HTTP como um protocolo de transporte opaco - como o TCP. Não é assim que as APIs de serviço da Web geralmente são tratadas - elas tentam aproveitar a semântica HTTP como uma linguagem padrão para APIs. Por que não retornar 401 para Não autorizado, em vez de retornar 200 com um código de erro personalizado e não padrão?
Avner Shahar-Kashtan
31
Por essa lógica, nenhum aplicativo deve retornar qualquer resposta no intervalo 400. Esse é precisamente o tipo de condição para a qual o intervalo de respostas 400 se destina. Além disso, sua primeira frase se aplica a todas as respostas futuras, bem como às que foram postadas antes da sua?
Dawood diz que restabelece Monica
31
Eu tenho que concordar aqui que isso é apenas 200. O usuário fez uma pergunta, nós a entendemos, sabemos a resposta certa e fornecemos a resposta (que passa a ser "Não"). Está tudo bem no terreno HTTP.
Lee Daniel Crocker
8
Hehe ... viagem rápida de "isso não é realmente um erro" para "então, você está dizendo que nada é um erro?"
Svidgen
28
Este. "Você tentou acessar um URL que não existe" é muito diferente de "Nossa empresa não opera em sua área". Apenas um tem algo a ver com HTTP.
CJ Dennis
87

5xxerros são erros do servidor - algo deu errado no servidor. Em particular, um 503 indica que:

atualmente, o servidor não consegue lidar com a solicitação devido a uma sobrecarga temporária ou manutenção agendada

4xxerros são erros do cliente - o cliente está fazendo uma solicitação que o servidor não pode ou não deseja atender. Em particular, um 403 indica que

o servidor entendeu a solicitação, mas se recusa a autorizá-la. Um servidor que deseja tornar público o motivo pelo qual a solicitação foi proibida pode descrever esse motivo na carga útil da resposta (se houver). [..] No entanto, uma solicitação pode ser proibida por razões não relacionadas às credenciais.

Eu argumentaria que isso 503é claramente incorreto, porque esse não é um problema temporário - você não suporta solicitações nessa área, ponto final. Pode-se argumentar que você espera apoiar a área, mas a intenção do código é incluir um cabeçalho indicando quando o cliente pode tentar novamente. "Em 6 meses" não adere à intenção.

403 é uma escolha melhor porque seu serviço proíbe simplesmente solicitações de determinados locais.

Eric Stein
fonte
403 é para casos em que o acesso é proibido e o cliente não pode fazer nada a respeito. Mas, nesse caso, o cliente pode (entrar no carro com seu laptop ou telefone), portanto 403 é inapropriado.
gnasher729
2
@ gnasher729 Os erros 4xx são para coisas que o cliente pode consertar, incluindo 403. A especificação (vinculada) especifica especificamente que o cliente pode tentar novamente com credenciais diferentes (supondo que as credenciais sejam o problema).
jaxad0127
22
@ gnasher729 403 não significa que o humano não possa fazer nada a respeito. Isso significa que o navegador não pode fazer nada sobre isso. O humano sempre pode redefinir a senha, conversar com o administrador ou, nesse caso, mudar para outra cidade.
Slebetman
11
@ gnasher729 O cliente não é o usuário.
Capitão Man
10
5xx = Opa, é ruim, espere enquanto solucionamos o problema. 4xx = Desculpe, mas por política não podemos atender a sua solicitação no momento. Aqui está o porquê .... #
121218 candied_orange
46

Nenhum desses.

Se sua API for bem projetada, o URL incluirá o nome da cidade, por exemplo

http://example.com/API/Vienna/HailRide

ou

http://example.com/API/HailRide?city=Vienna

como a geolocalização de IP não é confiável, seus usuários podem estar usando VPNs, eles podem desejar uma carona para outra pessoa etc. Sugerir uma cidade com base na localização do usuário é de responsabilidade do cliente da API . Geralmente, o cliente tem recursos muito melhores para determinar a localização do usuário de qualquer maneira (por exemplo, o serviço de localização de um dispositivo móvel).

Depois de fazer isso, a resposta correta para

http://example.com/API/SomeUnsupportedCity/HailRide

ou

http://example.com/API/HailRide?city=SomeUnsupportedCity

torna-se óbvio: 404 Não encontrado : não existe recurso para chamar uma carona em SomeUnsupportedCity.

Heinzi
fonte
6
Esta deve ser a resposta aceita: o design da API não se resume apenas ao cumprimento de códigos numéricos antigos, e o cenário sobre vpn etc. é bastante realista.
Edoardo
10
Tenho de discordar com isso. A inclusão do nome da cidade no URL pode levar a todos os tipos de problemas futuros, porque força o cliente a determinar um nome de cidade com base no local, e você pode não gostar do resultado. Por exemplo, você está em Los Angeles ou Beverly Hills? Londres ou Westminster? O que acontece se o cliente acha que está em Richardson, mas você deseja que uma API atenda toda a área de Dallas? Seria uma idéia melhor para o cliente fornecer apenas os locais de retirada / entrega; o servidor pode determinar se eles estão na área de serviço e responder de acordo.
Zach Lipton
11
@ZachLipton Tenho certeza de que os nomes das cidades foram apenas um exemplo, depende das regras de negócios reais do OP como elas definem "cidade" ou "local". Poderia muito bem ser uma coordenada.
Bergi
11
@ZachLipton não, o ponto aqui é não ter o IP de uso de serviço o cliente para entender a localização, que é apenas errado
Edoardo
3
@eddyce Concordo que usar o IP do cliente é uma má ideia por vários motivos. Estou dizendo que / API / Vienna / HailRide também é propenso a problemas, porque exige que o cliente converta locais em nomes de cidades, e esse não é um mapeamento 1 para 1 que corresponde às áreas em que a empresa atua.
Zach Lipton
26

Parece uma questão de furo redondo / peg quadrado. Por que sua única resposta precisa ser um código HTTP? Os códigos de erro HTTP não podem cobrir todos os casos de uso.

Todas as suas chamadas de API devem ter mensagens adicionais que retornam - ou seja, uma pequena mensagem de erro JSON. Dê a eles um 403 (porque, realmente, eles não têm permissão para usar a API, dada a localização) e retorne um pouco de informação adicional, conforme sugerido.

Se você não fizer isso, na próxima vez, perguntará qual código de erro HTTP retornará quando o usuário solicitar um SUV, mas apenas um Prius estiver disponível.

stdunbar
fonte
5
+1 na sua última frase. Resume bem.
LoztInSpace
11
Bem, isso claramente precisaria ser algum tipo de redirecionamento 3xx. ;)
Nome real Editado
O último caso provavelmente garante uma resposta 4xx de algum tipo: o usuário fez uma solicitação que o servidor não pode atender. Seria 400 se a escolha fosse algum tipo de entrada inválida ou 404 se o local em si simplesmente não existir. Embora possa ser 200 se for um critério de pesquisa e não houver correspondências.
jpmc26
11

Alguns fazem sentido.

403 Proibido, pelas razões que Eric Stein menciona em sua resposta . Você pode usar várias informações fornecidas pela solicitação para determinar onde o cliente está e quem é o cliente e, com base nessa solicitação, o servidor não pode ou não quer responder.

No entanto, eu também apresentaria 451 Indisponível por motivos legais como um possível status de retorno para alguns casos. Esse status espera que você inclua (nos cabeçalhos) um link para a legislação relevante. É especificamente para casos em que não é legal para o cliente acessar seus recursos e não existe um caso mais geral do cliente em uma região ou área não suportada.

Eu evitaria a série 5xx de status - isso geralmente indica problemas técnicos no servidor. Não parece ser o caso aqui.

Thomas Owens
fonte
Provavelmente, a razão nesse caso é que não faz sentido informar ao usuário sobre carros que não estão na cidade. Portanto, não é o caso para 451
max630
4
@ max630 Você não pode assumir isso com a pergunta. 403 Proibido é provavelmente a escolha certa. No entanto, se houver restrições legais no serviço, o 451 mais específico poderá ser usado. O 451 é frequentemente visto como uma versão mais específica do 403 para casos de uso muito particulares, por isso faz sentido trazê-lo à tona.
Thomas Owens
8
@ max630 - é perfeitamente possível que 451 seja apropriado aqui. Muitas jurisdições exigem que as operadoras desse tipo de serviço sejam registradas nas autoridades regionais antes de prestar o serviço. Na verdade, eles poderiam ser legalmente proibidos de processar determinadas solicitações se originarem fora da área.
Jules
5

Se a restrição for devido a motivos legais, o código de erro HTTP apropriado será HTTP 451, "Indisponível por motivos legais".

Normalmente, isso é usado no caso de material que foi revogado devido a ações ou ações da DMCA devido a campanhas de assédio ou similares, mas o espírito e a letra da definição de resposta declaram:

Este documento especifica um código de status HTTP (Hypertext Transfer Protocol) para uso quando o acesso a recursos é negado como consequência de demandas legais.

O código em si é uma referência ao Fahrenheit 451 de Ray Bradbury.

fofo
fonte
3

As pessoas geralmente esquecem que os códigos de status HTTP são extensíveis.

Os códigos de status HTTP são extensíveis. Os aplicativos HTTP não são necessários para entender o significado de todos os códigos de status registrados, embora esse entendimento seja obviamente desejável. No entanto, os aplicativos DEVEM entender a classe de qualquer código de status, conforme indicado pelo primeiro dígito, e tratar qualquer resposta não reconhecida como equivalente ao código de status x00 dessa classe, com a exceção de que uma resposta não reconhecida NÃO DEVE ser armazenada em cache. Por exemplo, se um código de status não reconhecido de 431 for recebido pelo cliente, ele poderá assumir com segurança que havia algo errado com sua solicitação e tratar a resposta como se tivesse recebido um código de status 400. Nesses casos, os agentes de usuário DEVEM apresentar ao usuário a entidade retornada com a resposta,

https://tools.ietf.org/html/rfc2616#section-6.1.1

Você sempre pode criar seu próprio código de status no intervalo 400 para uso por sua API e aplicativo cliente.

Pato de borracha
fonte
Hmm ... pode não ser necessário se a solicitação incluir um Expect token;city="Albequerque"cabeçalho. Então a resposta mais apropriada seria 417, expectativa falhada. tools.ietf.org/html/rfc2616#section-10.4.18 Supondo, é claro, que seja para um serviço da web.
Berin Loritsch
Talvez não seja necessário o @BerinLoritsch, mas, em vez de tentar forçar a adaptação de uma situação a um código existente, talvez seja melhor usar apenas um código personalizado.
precisa
0

No começo, pensei 503 porque a descrição "serviço indisponível" parece estar alinhada com o problema, mas olhando as definições , 503 é realmente específico da indisponibilidade do servidor. Depois, pensando mais, você está dizendo ao cliente que há um problema com a solicitação, não que haja um problema no lado do servidor.

403 está mais perto porque você está dizendo ao usuário que recebeu a mensagem e a entende, mas que o servidor não está disposto a satisfazê-la. Isso pode ser confuso para que uma explicação textual possa ser adicionada para descrever o cenário. Pela RFC, 404 também é um substituto válido para esse código.

A menos que alguém tenha sonhado com um novo código para isso, 403 ou 404 parecem ser os mais próximos.

JimmyJames
fonte
Definitivamente, não é um código 5xx, porque isso implica que a tentativa exata da mesma solicitação posteriormente poderá ser bem-sucedida. Um código 4xx definitivamente diz ao cliente para não tentar novamente sem alterar pelo menos parte da solicitação (nesse caso, o campo "local do serviço").
21818 Toby Speight
0

Você deve corresponder a descrição do erro ao código que está fornecendo:

  • se você diz Service not available in your area., deve dar um 404porque afirma que o serviço não está disponível .

  • se você diz You are not authorized for this service in your area., deve dar um 403porque afirma que o chamador não está autorizado .

Eu iria pelo segundo.

Edoardo
fonte
6
404 não é sobre disponibilidade , é sobre existência . Só porque um serviço não está disponível em algumas circunstâncias, você não deve fornecer uma resposta 404, a menos que queira que as pessoas acreditem que ele não existe. Uma resposta 404 não faria sentido para esta situação.
Jules
@jules De acordo com a especificação 403 (que pode estar desatualizada): "Se o servidor não desejar disponibilizar essas informações ao cliente, o código de status 404 (Não encontrado) poderá ser usado ". Portanto, se 403 está OK, 404 também seria, mas não necessariamente pelo motivo exposto.
21418 JimmyJames
@ JimmyJames - sim, está dentro da especificação, mas é uma péssima idéia, pois torna os problemas de depuração extremamente difíceis. Não é o que você deseja em uma API.
Jules
3
@Jules O serviço não existe em algumas áreas. Assim como existem muitas pequenas lojas que só existem na minha cidade, solicitando o endereço delas em outra cidade, a resposta correta é "não existe".
Andy
ehmm falar sobre "existência" de um caminho de URL de serviço é o menos filosófico, por uma questão de clareza, depois de publicar um caminho, você deve fornecer uma resposta; 403 é o caminho a seguir neste caso, com algum tipo de descrição verbal de a situação.
Edoardo
0

Existe um rascunho atual da Internet (que expira em 31 de dezembro de 2018) que propõe emendas ao status HTTP 451 Indisponível por motivos legais . O rascunho sugere que uma resposta 451 deve conter um geo-scope-blockcabeçalho que "corresponda à lista separada por vírgula de códigos de país alfa-2 definidos em [ISO.3166-1]". No entanto, o rascunho também especifica que o código 451 não deve ser usado "por um operador para negar o acesso a um recurso com base em uma política especificada pelo operador (em oposição a uma demanda legal feita ao operador)".

Portanto, supondo que você não tenha uma demanda legal pelo geobloco, 451 não é o código correto. Qual é o código correto então? Bem, várias outras respostas já sugeriram 403 Proibido , mas todas parecem "baseadas em opiniões", então vamos ver o que os outros estão fazendo:

Portanto, não existe uma solução universal; você terá que escolher uma que ache melhor para sua situação. Mas, qualquer que seja a sua escolha, não deixe de explicar o problema real no corpo da resposta .

Eu diria que não haveria nada de errado em especificar um código de status HTTP personalizado, como o RubberDuck já respondeu . Um código de status personalizado no intervalo de 400 pode até ser uma ligação muito boa, porque isso definitivamente chamará a atenção dos desenvolvedores se eles virem algo como "HTTP status 499". Um "403" é muito fácil de passar como " OK, então eu entendi errado minha senha, vamos tentar outra coisa ", e isso resulta em horas perdidas.

Zero um
fonte