2011-09-03 5 views
3

Google은 REST 서비스를 제작하고 있으며 누군가가 존재하지 않는 상위 ID가있는 리소스를 요청할 때 수행 할 작업에 대해 논의합니다.API 개발 : 잘못된 요청 HTTP 상태 코드 (REST)를 반환해야하는 경우

예 : 회사와 관련된 사람들의 목록을 요청하고 있으므로 GET (ID는 1)이지만 회사 ID는 존재하지 않습니다.

나는 REST의 정의라고 주장 것이라고 우리는 HTTP를 잘못된 요청은 사양에 따라, 단지 잘못된 구문 때문에 단순 수익률 (A HTTP 204 (No Content) 결과) 빈 목록을 것 :

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

형식이 잘못된 구문으로 인해 요청을 서버에서 이해할 수 없습니다. 클라이언트는 수정하지 않고 요청을 반복해서는 안됩니다.

해석해야 할 오류가 없다는 점도 분명합니다. 요청한 리소스가 존재하지 않는다고 생각합니다.

모범 사례에 대한 생각?

여기에 SO 토론이 있습니다 : 좀 더 추상적이지만 HTTP 400 (bad request) for logical error, not malformed request syntax이지만이 글을 게시해야하거나 단순히 그 질문을 사용하면 찢어집니다. 를 찾을 수 없습니다 - 당신이

GET /company/1 

을하고 ID를 1로하는 회사가 존재하지 않는 경우

+0

빈 목록에 Jersey (JAX-RS) 기본값을 사용해 보았습니다. null 목록을 반환하면 JSON에서 빈 목록이 표시되고 204 오류도 표시됩니다. 그것이 올바른 행동이라고 말하는 것은 아니지만 데이터 포인트입니다. –

답변

6

는 그때 적절한 HTTP 상태 코드가 404 생각합니다. 당신이 할 것 인 경우에

그러나,

GET /companies?id=1 

는 그럼 난 200 기업의 빈 목록을 반환합니다.

+0

빈 목록에 Jersey (JAX-RS) 기본값을 시도했습니다.null 목록을 반환하면 JSON에서 비어있는 목록이 표시되지만 204 오류도 표시됩니다. 그것을 옳게 만들지는 못합니다. 404에 대해 동의하면 엄격한 REST 해석에서 그렇게 할 것이라고 생각합니다. –

+0

저지를 사용하면 GET/companies를 요청하면? id = xyz 여기서 id는 정수라고 가정하면 400 대신 404가됩니다. Jersey 또는 JAX-RS인지 확실하지 않습니다. id 인 경우 404가 적합하지만 일종의 검색 기준에 대한 쿼리 매개 변수를 사용하는 일반적인 경우 400을 원하거나 해당 id가 없어 결과를 반환하지 않습니다. 좋은 기본 설정이 스펙에서 나온 것일 수도 있지만 최상의 대답은 컨텍스트에 따라 다릅니다. – jhericks

+0

@jhericks 당신이 만들고 싶었던 점에 대한 훌륭한 예 - 감사합니다. 감사합니다. –

3

204는 오류 코드가 아니며 성공 코드입니다.하지만 그 점은 간단합니다. 빈 목록에 대해서는 자주 보지 않고 성공적인 DELETE와 같이 응답 할 의미있는 컨텐츠가없는 성공 응답입니다. 예를 들어, JSON을 반환하는 경우 콘텐츠가 빈치로 표시되는 [] 인 200이 표시됩니다. 그러나, 나는 그것이 귀하의 경우에 그것을 사용하는 것이 잘못 생각하지 않습니다.

404 설명하지 않는 것이 더 일반적인 오류입니다. 구문 오류가 아니므로 400은 적절하지 않지만 실제로는 리소스가 없습니다. 404 찾을 수 없음은 정확한 응답입니다.

그러나 200, 204 및 404 중에서 선택하면 정답은 다음과 같습니다. 문제는 오류인지 여부입니다. 404는 표현력이 뛰어납니다 (클라이언트는 해당 회사가 없다는 것을 알 수 있습니다).하지만 보안을 위해 표현력을 교환 할 수 있습니다. 이는 클라이언트가 해당 ID를 가진 회사의 존재 여부를 알 수 없기 때문일 수 있습니다.

+0

불평에 대한 공정한 점, 나는 그것을 상태 코드라고 불렀어야했다. 필자가 스펙을 인용하고 이것이 (코드의 일반적인 경우에) 사용하는 것과 동일하다면, 나는 204 년 후에 error라는 단어를 제거했다. 기술적으로, 당신은 그것을 불러 내고 기술적으로 게임의 이름이다. 그래서 나는 바꿨다. 그것 제목에서 204 참조에서 제거했습니다 –

0

캐싱은 어떻게됩니까? 200 개만 캐시되며 204와 404는 모두 캐시되지 않습니다. 이것이 중요하다면 빈 목록이 200 인 것 같습니다. 빈 단일 요소는 무엇인지 모르시겠습니까?

+1

이것은 1 살입니다;) –