우리의 서비스는 현재 5 개 도시에 있습니다. 다른 도시에서 서비스 API를 호출하려고하면이 오류가 발생 Service not available in your area
합니다.
문제는이 오류에 적합한 http 코드는 무엇입니까?
- 503 : 서비스를 사용할 수 없음
- 403 금지
또는 다른 것?
우리의 서비스는 현재 5 개 도시에 있습니다. 다른 도시에서 서비스 API를 호출하려고하면이 오류가 발생 Service not available in your area
합니다.
문제는이 오류에 적합한 http 코드는 무엇입니까?
또는 다른 것?
답변:
모든 HTTP 오류 코드는 부적절합니다. HTTP 관점에서 어떤 종류의 오류나 문제가 없으므로 200 범위에 있어야합니다. 귀하는 일부 사용자에게이를 알리는 문서를 반송하여 서비스를받지 않을 것이라고 정중하게 알립니다. 그리고이 모든 것이 잘 진행됩니다.
사용자는 응용 프로그램 을 사용할 수 없습니다 . 그것은 사고가 아닌 비즈니스 로직에 의해 결정된 의식적인 결정입니다. HTTP 레벨에서는 모든 것이 불쾌합니다.
편집하다
우리가 여기서보고있는 것은 구식 학교와 새로운 학교의 충돌입니다. HTTP를 디자인 할 때 웹 서비스, SOAP, JSON 및 REST 원칙이 없었습니다. TCP 이상의 프로토콜로 이미 애플리케이션 수준에 근접한 것으로 간주되었으며 많은 고급 상태 코드가 정의되었습니다. 웹을보다 풍부하고 높은 수준의 서비스에 사용하기 시작하고 "봉투"를 전송하는 일반적인 수단이 필요했을 때, 디자이너는 HTTP가 어디에나 있기 때문에 새롭고 더 깨끗한 프로토콜을 정의하는 대신 HTTP를 하이재킹했습니다.
따라서 현대 웹 서비스 컨텍스트에서 HTTP는 실제로 단순한 전송 계층에 지나지 않으며 대부분의 코드는 적용되지 않거나 사용되지 않는 것으로 간주 될 수 있습니다. 응용 프로그램 상태에 가깝고 목록에 있기 때문에 한 번 해치지 않을 수도 있지만 잘못된 메시지를 보낼 것이라고 생각합니다. 웹 서비스 컨텍스트에서 HTTP가 해당 조절 역할을 수행하는 것을 원하지 않습니다.
5xx
오류는 서버 오류입니다. 서버에서 문제가 발생했습니다. 특히 503 은 다음을 나타냅니다.
일시적인 과부하 또는 예정된 유지 보수로 인해 서버가 현재 요청을 처리 할 수 없습니다.
4xx
오류는 클라이언트 오류입니다. 클라이언트가 서버가 수행 할 수 없거나 이행 할 의사가 없음을 요청하고 있습니다. 특히 403 은
서버는 요청을 이해했지만 승인을 거부합니다. 요청이 금지 된 이유를 공개하려는 서버는 응답 페이로드에 해당 이유를 설명 할 수 있습니다 (있는 경우). [..] 그러나 자격 증명과 관련이없는 이유로 요청이 금지 될 수 있습니다.
나는 503
이것이 일시적인 문제가 아니기 때문에 분명히 틀렸다고 주장 할 것입니다 -당신은 그 지역의 요청을 기간 동안 지원하지 않습니다. 결국이 영역을 지원하기를 희망한다고 주장 할 수 있지만 코드의 의도는 클라이언트가 다시 시도 할 수있는시기를 나타내는 헤더를 포함하는 것입니다. "6 개월 안에"는 의도를 고수하지 않습니다.
403
서비스가 단순히 특정 로케일의 요청을 금지하기 때문에 더 나은 선택입니다.
둘 다 아닙니다.
API가 잘 디자인 된 경우 URL에 도시 이름이 포함됩니다 (예 :
http://example.com/API/Vienna/HailRide
또는
http://example.com/API/HailRide?city=Vienna
IP 위치 정보를 신뢰할 수 없기 때문에 사용자가 VPN을 사용하고있을 수 있으며, 사용자가 다른 사람을 타기를 원할 수도 있습니다. 사용자의 위치를 기반으로 도시를 제안하는 것은 API 클라이언트 의 책임입니다. 일반적으로, 클라이언트는 어쨌든 사용자의 위치 (예를 들어, 모바일 장치의 위치 서비스)를 결정하기위한 훨씬 더 나은 자원을 갖는다.
일단 그렇게하면 정답은
http://example.com/API/SomeUnsupportedCity/HailRide
또는
http://example.com/API/HailRide?city=SomeUnsupportedCity
분명하게하지 : 404 찾을 수 없음 : SomeUnsupportedCity에 타고 존재를 환영하기위한 어떤 자원.
이것은 둥근 구멍 / 사각형 못 질문처럼 보입니다. 왜 유일한 응답이 HTTP 코드 여야합니까? HTTP 오류 코드가 모든 사용 사례를 다룰 수는 없습니다.
모든 API 호출에는 추가 메시지 (예 : 작은 JSON 오류 메시지)가 있어야합니다. 403 명 (정말로 위치에 따라 API를 사용할 수있는 권한이 없기 때문에)을 제공하고 제안한대로 추가 정보를 반환합니다.
이 작업을 수행하지 않으면 다음에 사용자가 SUV를 요청했지만 Prius 만 사용할 때 어떤 HTTP 오류 코드를 반환할지 묻습니다.
몇 가지 의미가 있습니다.
403 Eric Stein이 그의 답변에서 언급 한 이유로 금지되었습니다 . 요청에서 제공 한 다양한 정보를 사용하여 클라이언트의 위치와 클라이언트를 파악할 수 있으며 해당 요청에 따라 서버가 응답 할 수 없거나 응답하지 않을 수 있습니다.
그러나 법적 사유로 인해 451 사용할 수 없음을 일부 경우에 가능한 반품 상태로 제시하기도합니다. 이 상태에서는 헤더에 관련 법률에 대한 링크를 포함시킬 것으로 예상됩니다. 클라이언트가 귀하의 리소스에 액세스하는 것이 합법적이지 않은 경우를위한 것이며,보다 일반적인 클라이언트 사례는 지원되지 않는 지역이나 지역에 존재하지 않습니다.
5xx 계열의 상태를 피하려고합니다. 이는 종종 서버 측 기술 문제를 나타냅니다. 여기서는 그렇지 않습니다.
제한이 법적 이유 때문인 경우 적절한 HTTP 오류 코드는 HTTP 451, "법적 이유로 사용할 수 없음"입니다.
이는 일반적으로 괴롭힘 캠페인 등으로 인한 DMCA 소송 또는 소송으로 인해 취소 된 자료의 경우에 사용되지만 응답 정의 의 정신과 서한은 다음과 같습니다.
이 문서는 법적 요구에 따라 리소스 액세스가 거부 될 때 사용할 HTTP (Hypertext Transfer Protocol) 상태 코드를 지정합니다.
코드 자체는 Ray Bradbury의 Fahrenheit 451 에 대한 참조 입니다.
사람들은 종종 HTTP 상태 코드가 확장 가능하다는 것을 잊어 버립니다.
HTTP 상태 코드는 확장 가능합니다. HTTP 애플리케이션은 등록 된 모든 상태 코드의 의미를 이해할 필요는 없지만 그러한 이해는 분명히 바람직합니다. 그러나 응용 프로그램은 첫 번째 숫자로 표시된 상태 코드의 클래스를 이해해야하며 인식 할 수없는 응답을 캐시해서는 안된다는 점을 제외하고 인식 할 수없는 응답을 해당 클래스의 x00 상태 코드와 동등한 것으로 처리해야합니다. 예를 들어, 클라이언트가 인식 할 수없는 상태 코드 431을 수신하면 요청에 문제가 있다고 가정하고 응답을 400 상태 코드를 수신 한 것처럼 처리 할 수 있습니다. 그러한 경우, 사용자 에이전트는 엔티티가 응답과 함께 리턴 한 사용자에게 제시해야한다.
https://tools.ietf.org/html/rfc2616#section-6.1.1
API 및 클라이언트 응용 프로그램에서 사용할 수 있도록 400 범위 의 상태 코드를 언제든지 만들 수 있습니다 .
Expect token;city="Albequerque"
헤더가 포함 된 경우 필요하지 않을 수 있습니다 . 그런 다음 가장 적절한 응답은 417이며 예상은 실패했습니다. tools.ietf.org/html/rfc2616#section-10.4.18 물론 이것은 웹 서비스를위한 것이라고 가정합니다.
처음에는 "서비스를 사용할 수 없음"이라는 설명이 문제와 일치하는 것 같지만 정의를 보면 503은 실제로 서버를 사용할 수 없음에 따라 다릅니다. 그런 다음 더 많은 것을 생각하면 서버 측 문제가 아니라 요청에 문제가 있음을 클라이언트에 알리는 것입니다.
403은 사용자에게 메시지를 수신하고 이해했지만 서버가 메시지를 만족시키지 않는다는 것을 알리기 때문에 더 가깝습니다. 시나리오를 설명하기 위해 텍스트 설명을 추가 할 수 있으므로 혼동 될 수 있습니다. RFC에 따라 404도이 코드를 대신 할 수 있습니다.
누군가가 이것을 위해 새로운 코드를 꿈꾸지 않는 한, 403 또는 404가 가장 가까운 것 같습니다.
제공하는 코드와 오류 설명을 일치시켜야합니다.
당신이 말하면 Service not available in your area.
당신은 404
서비스를 사용할 수 없다고 주장하기 때문에 제공해야 합니다 .
당신이 말하면 You are not authorized for this service in your area.
당신은 403
발신자가 권한 이 없다고 주장하기 때문에 제공해야합니다 .
나는 두 번째 갈 것입니다.
법적 근거로 HTTP 451 사용 불가능 상태에 대한 수정을 제안 하는 최신 인터넷 초안 (2018 년 12 월 31 일에 만료 예정)이 있습니다. 이 초안은 451 응답에 "[ISO.3166-1]에 정의 된 쉼표로 구분 된 알파 -2 국가 코드 목록에 해당하는"헤더를 포함해야한다고 제안합니다 . 그러나이 초안은 또한 "사업자에 의해 법적 요구가 제기되는 것과는 대조적으로"운영자가 규정 한 정책에 기초하여 운영자가 자원에 대한 액세스를 거부하기 위해 코드 451을 사용해서는 안된다고 명시하고있다.geo-scope-block
따라서 지오 블록에 대한 법적 요구가 없다고 가정하면 451은 올바른 코드가 아닙니다. 그렇다면 올바른 코드는 무엇입니까? 글쎄, 다른 많은 답변이 이미 403 Forbidden을 제안 했지만 모두 "의견 기반"인 것처럼 보이므로 다른 사람들이하는 일을 보자.
따라서 보편적 인 해결책은 없습니다. 자신의 상황에 가장 잘 맞는 것을 선택해야합니다. 그러나 어느 쪽을 선택하든 응답 본문에서 실제 문제 를 설명 해야합니다 .
RubberDuck이 이미 응답 한 것처럼 사용자 지정 HTTP 상태 코드를 지정하는 데 아무런 문제가 없다고 말하고 싶습니다 . 400 범위의 사용자 지정 상태 코드는 실제로 "HTTP 상태 499"와 같은 것을 볼 경우 개발자의 관심을 끌기 때문에 실제로는 꽤 좋은 호출 일 수 있습니다. "403"은 " 확인하기에 암호가 잘못되었으므로 다른 것을 시도해 보자 "로 전달하기가 너무 쉬워서 시간이 낭비됩니다.