Я занимаюсь разработкой простого сервиса RESTful для турниров и расписаний. Когда турнир создается с помощью запроса POST, содержащего тело JSON, турнир вставляется в элемент BiMap
, объявленный в реализации DAO следующим образом:
private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());
Когда создается турнир, возвращается связанный с ним идентификатор строки, чтобы пользователь мог иметь будущую ссылку на этот турнир. Он / она может получить информацию от нового турнира, выполнив следующий запрос:
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
Но что, если турнир с таким идентификатором не найден? Пока я возвращаю 204 ответа. Ну, Джерси делает это для меня, когда возвращается null
одним из методов. Это метод, который соответствует маршруту выше:
@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;
}
Мой вопрос: нормально ли возвращать 204: No Content
ответ, или это должен быть 404
ответ, поскольку ресурс не был найден?
Если я должен изменить его на 404, очевидный вопрос: я должен изменить подпись метода, верно? Так как теперь турнир (типа Tournament
) не может быть возвращен, метод должен выглядеть иначе. Должен ли я использовать Response
тип в качестве типа возврата вместо?
источник
{content: ''}
), ответ 204 был бы неуместным.2015-02-29
быть, лучше использовать, потому что это дата, которой вообще не существует?Вы должны вернуть 404. Вы можете сделать это, бросив NotFoundException ( https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).
Также, пожалуйста, посмотрите на этот вопрос SO, если вам нужно контролировать возвращаемый тип контента /programming/23858488/how-i-return-http-404-json-xml-response-in-jax-rs- Джерси-на-кот
источник
Ваш запрос
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
.Если
http://localhost:8080/eventscheduler/
не существует как конечная точка, вы должны вернуть 404. Вы пытаетесь получить доступ к ресурсу (/eventscheduler/
), который не существует. Это будет указывать клиенту, что сервер существуетlocalhost:8080
, но вeventscheduler
конечной точке ничего нет .Если
http://localhost:8080/eventscheduler/
существует в качестве конечной точки, но требуемые ресурсы недоступны, подходит ошибка 5xx. Хороший пример этого может быть, если база данных находится в автономном режиме, где вы можете вернуть 503. Конечно, вы можете просто захотеть вернуть общую ошибку 500 вместо конкретного экземпляра.Если
http://localhost:8080/eventscheduler/
существует, но вещь, представленная какc15268ce-474a-49bd-a623-b0b865386f39
, не существует, я бы вернул 200 с телом, указывающим детали. Конечная точка существует, сделанный запрос был полностью действительным и мог быть обработан, но совпадений не было.Если запрос вашего клиента к конечной точке был недействительным, вы бы посмотрели на другие ошибки 4xx. Вы можете указать, что клиент не авторизован для доступа к конечной точке или элементам, запрошенным с помощью 401 или 403, или может использовать 400, чтобы указать, что запрос недействителен. С любым из них дополнительная информация может быть предоставлена в теле ответа.
источник
/user
и используется как/user?email=test@example.com
. Как потребитель API, я хочу знать, если/user
по какой-то причине на сервере не существует (возможно, он был добавлен в v2 API, а сервер - в v1, или он был переименован в v3), или если пользователь с электронной почтойtest@example.com
не существует Первый - 404, второй - 200 с телом, которое не указывает ни одного пользователя с таким адресом электронной почты.