Estou desenvolvendo um serviço RESTful simples para torneios e horários. Quando um torneio é criado por meio de uma solicitação POST que contém um corpo JSON, o torneio é inserido em um BiMap
declarado da seguinte maneira em uma implementação do DAO:
private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());
Quando um torneio é criado, seu ID de string associado é retornado para que o usuário possa ter referência futura a esse torneio. Ele / ela pode obter informações de volta do novo torneio, realizando a seguinte solicitação:
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
Mas e se nenhum torneio com esse ID for encontrado? Até agora, estou retornando uma resposta 204. Bem, Jersey está fazendo isso por mim ao retornar null
de um de seus métodos. Este é o método que corresponde à rota acima:
@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
Optional<Tournament> optTournament = tournamentDao.getTournament(id);
if (optTournament.isPresent())
return optTournament.get();
return null;
}
Minha pergunta é: está correto retornar uma 204: No Content
resposta ou deve ser uma 404
resposta, pois o recurso não foi encontrado?
Se devo alterá-lo para uma questão 404, óbvia: devo alterar a assinatura do método, certo? Como agora um torneio (do tipo Tournament
) pode não ser retornado, o método deve parecer diferente. Em vez disso, devo usar o Response
tipo como tipo de retorno?
fonte
{content: ''}
), uma resposta 204 seria inadequada.2015-02-29
seria melhor, já que é uma data que não existe?Você deve retornar um 404. Você pode fazer isso lançando uma NotFoundException ( https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).
Além disso, consulte esta questão de SO se precisar controlar o tipo de conteúdo retornado /programming/23858488/how-i-return-http-404-json-xml-response-in-jax-rs- jersey-on-tomcat
fonte
O seu pedido é
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
.Se
http://localhost:8080/eventscheduler/
não existir como um terminal, você deve retornar um 404. Você está tentando acessar um recurso (/eventscheduler/
) que não existe. Isso indicaria para um cliente que existe um servidorlocalhost:8080
, mas não há nada noeventscheduler
terminal.Se
http://localhost:8080/eventscheduler/
existir como um terminal, mas os recursos necessários não estiverem disponíveis, um erro 5xx é apropriado. Um bom exemplo disso seria se um banco de dados estivesse offline, onde você poderia retornar um 503. Obviamente, você pode apenas querer retornar um erro 500 genérico em vez de uma instância específica.Se
http://localhost:8080/eventscheduler/
existe, mas a coisa representada porc15268ce-474a-49bd-a623-b0b865386f39
não existe, eu retornaria um 200 com um corpo indicando os detalhes. O terminal existe, a solicitação feita foi totalmente válida e pode ser processada, mas não houve correspondência.Se a solicitação do cliente para o terminal não for válida, você observaria os outros erros 4xx. Você pode indicar que o cliente não está autorizado a acessar o terminal ou os itens solicitados com 401 ou 403 ou pode usar um 400 para indicar que a solicitação é inválida. Com qualquer um desses, informações adicionais podem ser fornecidas no corpo da resposta.
fonte
/user
e seja usado como/[email protected]
. Como consumidor de API, quero saber se,/user
por algum motivo, não existe no servidor (talvez tenha sido adicionado na v2 da API e o servidor esteja na v1 ou tenha sido renomeado na v3) ou se o usuário com o email[email protected]
não existe. O primeiro é um 404, o segundo é um 200 com um corpo que indica nenhum usuário com esse endereço de email.