요청에 필수 매개 변수가없는 경우 어떤 HTTP 상태 응답 코드를 사용해야합니까?


답변:


387

상태 422는 사양 에 따라 가장 적합한 것으로 보입니다 .

422 (처리 할 수없는 엔티티) 상태 코드는 서버가 요청 엔티티의 컨텐츠 유형을 이해하므로 (415 (지원되지 않는 매체 유형) 상태 코드가 부적절 함) 요청 엔티티의 구문이 정확함 (따라서 400 (잘못된 요청) ) 상태 코드는 부적절하지만 포함 된 지침을 처리 할 수 ​​없습니다. 예를 들어, XML 요청 본문에 올바른 형식 (구문 적으로 올바른)이지만 의미 상 잘못된 XML 명령어가 포함 된 경우이 오류 조건이 발생할 수 있습니다.

그들은 잘못된 XML이 잘못된 구문의 예라고 말합니다 (400을 호출 함). 잘못된 형식의 쿼리 문자열은 이와 유사 해 400이 매개 변수가없는 올바른 형식의 쿼리 문자열에 적합하지 않은 것 같습니다.

@DavidV 업데이트 는이 사양이 핵심 HTTP가 아닌 WebDAV에 대한 것임을 올바르게 지적합니다. 그러나 일부 인기있는 WebDAV API는 더 나은 상태 코드가 없기 때문에 어쨌든 422를 사용하고 있습니다 ( this 참조 ).


2
IMO 추가 값이 없거나 누락 된 값이 아닌 쿼리 문자열의 값이 올바르지 않은 경우에 이것을 사용합니다. 즉. 이메일과 그 가치는 '123123'입니다
Derek Litz

2
URL 경로의 메소드 서명으로 GET 및 POST 매개 변수를 생각하는 경향이 있으므로 404가 나에게 적합합니다. 공용 소비를위한 RESTful API에서 누락 / 추가 매개 변수를 리턴하는 것이 좋습니다. URL과 관련하여 쿼리 문자열 매개 변수는 일반적으로 리소스를 식별하는 데 중요하며 추가 또는 누락 된 매개 변수는 가정없이 존재하지 않는 리소스를 나타냅니다. 물론, 명시 적으로 명시함으로써 견고성과의 절충이 있으며, 선택적 매개 변수는 잠재적 인 오류로 인해 리소스를 잠재적으로 취약하게 만듭니다. 유용성이 있습니다.
Derek Litz

13
참조 된 스펙은 WebDAV에 대한 것이며 HTTP 표준 스펙이 아닙니다.
David V

1
@Kelvin 블로그 게시물을 지적 해 주셔서 감사합니다. 예를 들어 Twitter가 422를 사용하고 있음을 알면 도움이됩니다. 첫 번째 줄에서 사양이 WebDAV라는 것을 명확히하면 답이 더 나을 것입니다. 귀하의 답변을 처음 읽을 때 링크를 따라갈 때까지 HTTP 표준 사양을 의미한다고 생각했습니다.
David V

3
이것은 읽을만한 가치가 있습니다 : bennadel.com/blog/… 나는 빠진 매개 변수에 422를 사용하지 않을 것입니다. 나는 400더 적절 하다고 생각 합니다.
Zelphir Kaltstahl

184

표준 설정이 확실하지는 않지만 최신 HTTP 사양 (2014 년부터) 으로 다음과 같은 400 Bad Request를 사용했을 것입니다 .

6.5.1. 400 잘못된 요청

400 (잘못된 요청) 상태 코드는 클라이언트 오류 (예 : 잘못된 요청 구문, 잘못된 요청 메시지 프레이밍 또는 사기성 요청 라우팅)로 인식되는 것으로 인해 서버가 요청을 처리 할 수 ​​없거나 처리하지 않음을 나타냅니다.


65
400 Bad Request의미 적 오류가 아닌 프로토콜 수준 문제를 나타냅니다. 프로토콜 수준이 아닌 응용 프로그램 수준 오류를 나타 내기 위해 HTTP 상태 코드를 가로 채려고한다면 412어떻게해야합니까?
매트 Zukowski

36
Google의 OAuth 1.0 구현은이 답변에 동의합니다. POST 매개 변수가 없거나 지원되지 않는 경우 400 응답이 제공됩니다. code.google.com/apis/accounts/docs/OAuth_ref.html
Tom

1
@ matt-zukowski : "412 : 하나 이상의 요청 헤더 필드에 지정된 사전 조건이 서버에서 테스트 될 때 false로 평가되었습니다." RFC2616 에서 -POST 인 경우 매개 변수는 요청 헤더 필드가 아니라 요청 본문에 있습니다. 기술적으로 GET 메소드는 요청 헤더에 매개 변수의 매개 변수를 전송하지만 대신 일관성이 있습니까?
toong

6
@MattZukowski 400은 응용 프로그램 수준 상태 코드입니다. RFC 7231 초안의 리워드를 보면 알 수 있습니다. 최신 변경 사항의 저자는 422 발명 불행하게도, 최신 버전의 표현은 매우 분명하지 않다
대럴 밀러

9
@DarrelMiller가 맞습니다 ( 직접 링크 ) : "400 (잘못된 요청) 상태 코드는 서버가 클라이언트 오류로 인식 된 것으로 인해 요청을 처리 할 수 ​​없거나 처리하지 않음을 나타냅니다 (예 : 잘못된 요청 구문, 잘못된 요청 메시지) 프레임 또는 사기성 요청 라우팅) " 의미론 및 확장 성 기대에 따라 (언젠가 매개 변수없이 요청을 발행 할 수 있습니까?) 표준 HTTP에서는 400 및 404 만 적합 해 보입니다. 그렇지 않으면 API에 대한 새 코드를 발명하지만 의미를 과부하시키지 마십시오.
tne

31

.NET 의 WCF APIHTTP 404webHttpBinding을 사용할 때 "Endpoint Not Found"오류 를 리턴하여 누락 된 매개 변수를 처리합니다 .

404 Not Found당신은 그것의 매개 변수 서명과 함께 웹 서비스 메소드 이름을 고려한다면 의미가 있습니다. 즉, 웹 서비스 메소드를 공개하고 LoginUser(string, string)요청 LoginUser(string)하면 후자를 찾을 수 없습니다.

기본적으로 이는 지정한 매개 변수 서명과 함께 호출하는 웹 서비스 메서드를 찾을 수 없음을 의미합니다.

10.4.5 404 찾을 수 없음

서버가 Request-URI와 일치하는 것을 찾지 못했습니다. 조건이 일시적인지 영구적인지에 대한 표시는 없습니다.

400 Bad Request, 같은 거트 제안 , 유효한 응답 코드 남아 있지만 나는 일반적으로 낮은 수준의 문제를 표시하는 데 사용됩니다 생각합니다. 잘못된 HTTP 요청, 누락되거나 유효하지 않은 HTTP 헤더 또는 이와 유사한 것으로 쉽게 해석 될 수 있습니다.

10.4.1 400 잘못된 요청

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


이것이 CherryPy가 기본적으로하는 일입니다.
Derek Litz

모델을 수락하고 모델의 일부가 누락 된 게시 요청을 처리 할 때는 어떻습니까? 이 경우에는 404를 얻지 못합니다. 대신 내가 실수하지 않고 유효하지 않은 모델을 얻으면 지금 무엇을해야할지 결정해야합니다.
Shane Courtrille

1
이 해석은 스트레치처럼 보이고 REST POV보다는 RPC를 표현합니다. URI가 식별자이며 존재하며 발견되었습니다. 본문에 전송 된 내용은 리소스 식별자의 일부가 아닙니다. 422가 더 적합합니다.
요나

404는 정답입니다. 웹에서 URL을 편집하여 합의를 찾으십시오!
jenson-button-event

8

400 잘못된 요청 코드를 보낼 수 있습니다. 가장 일반적인 4xx 상태 코드 중 하나이므로이를 사용하여 원하는 것을 의미 할 수 있습니다. 클라이언트가 올바르게 처리하기 위해 응용 프로그램에 필요한 정보 / 매개 변수가없는 요청을 보내고 있습니다.


7

API 프로젝트 중 하나에서 매개 변수 누락으로 인해 100 %로 완전히 채울 수없는 경우 일부 요청에 409 상태를 설정하기로 결정했습니다.

HTTP 상태 코드 "409 충돌"은 사용자가 충돌의 원인을 인식 할 수 있도록 충분한 정보를 포함해야하기 때문에 좋은 시도였습니다.

참조 : w3.org/Protocols/

따라서 400 또는 404와 같은 다른 응답 중에서 409를 선택하여 새 올바른 요청을 설정하는 데 도움이되는 요청에서 메모를 살펴볼 필요성을 강제했습니다.

어떤 식 으로든 요청이 완전히 정확하지 않은 경우 일부 데이터를 보내야하므로 클라이언트가 메시지를보고 요청에서 무엇이 잘못되었는지 이해하도록 강제해야합니다.

일반적으로 누락 된 매개 변수 만있는 경우 400 및 누락 된 매개 변수 배열 로 이동합니다 . 그러나 특정 사례 메시지와 같은 추가 정보를 보내야 할 때 클라이언트가 처리 할 것인지 더 확실하게 확인하려면 409를 보냅니다.


2
이것은 명백한 잘못입니다. 409는 @ MaximeGélinas가 자원이 이미 존재하고 복제가 허용되지 않는 상황을 지적하므로 동시성 문제를위한 것입니다.
gimlichael

사양에 따라 "409 (충돌) 상태 코드는 대상 자원의 현재 상태와 충돌하여 요청을 완료 할 수 없음을 나타냅니다." . 누락 된 매개 변수에 사용하는 것은 잘못입니다. 그것은 완전히 다른 종류의 오류입니다.
Mark Amery

5

필요한 매개 변수의 항목이 API 엔드 포인트가 요구하는 것과 일치하지 않지만 (너무 짧은 암호와 같은) 누락 된 매개 변수의 경우 406 (허용되지 않음)이됩니다.


8
406 Unacceptable은 Accept 헤더와 함께 사용됩니다 (서버가 응답을 보낼 수 없으면 클라이언트가 이해할 것입니다). "요청에 의해 식별 된 리소스는 요청에 전송 된 수락 헤더에 따라 허용되지 않는 컨텐츠 특성을 갖는 응답 엔티티 만 생성 할 수 있습니다. . 현재 사양에는 "오른쪽"선택의 여지가 없기 때문에 나는 422와 함께 붙어있어 : - /
JakubKnejzlik

이것을 위해 406을 사용하는 것은 잘못되었습니다. 406 코드는 요청 이 수락 되지 않았 음을 의미하지 않습니다 . 서비스 할 수있는 응답이 요청에서 보낸 수락 헤더를 기반으로 클라이언트 가 허용 할 수없는 응답이기 때문에 요청을 만족시킬 수 없음을 의미합니다 . 예를 들어 요청 Accept-Language: de은 독일어로만 응답을 표시하지만 서버에서 사용할 수있는 요청 된 문서의 유일한 버전은 영어 또는 프랑스어로되어 있음을 나타내는 요청이 포함되어 있습니다. 요청에서 누락 된 매개 변수를 나타내는 데 사용하는 것은 올바르지 않습니다. 사양의 정의에 따라.
마크 애 머리

3

관심있는 사람들을 위해 Spring MVC (3.x 이상)는이 경우 400을 반환하는데, 이는 나에게 잘못된 것 같습니다.

여러 Google URL (accounts.google.com)을 테스트하고 필수 매개 변수를 제거했으며이 경우 일반적으로 404를 반환합니다.

Google을 복사하겠습니다.


18
Google이 자동으로 Google이 올바르게 수행한다는 의미는 아닙니다!
rve

4
나는 반드시 '올바른'것이 아니라 때로는 옳고 그른 것이 서로 다른 두 가지라는 것에 동의합니다. 어쨌든 .. 독자까지 :)
Neromancer

일부 Google API는 400을 반환합니다 (예 : github.com/google/google-api-nodejs-client/issues/404
Dennis

이는 잘못된 것입니다 (스프링 MVC는하지 JAX-RS 준수 이유)
젠슨 버튼 이벤트를

3

404 Not Found지정된 자원을 찾을 수 없으므로 a를 사용해야 한다고 주장 할 수 있습니다 .


3
이는 조회 매개 변수를 올바른 데이터 유형으로 변환 할 수없는 경우 Java JAX-RS의 기본 동작입니다. 그래도 동의하지 않습니다. 발견 된 자원 WAS : 조회 매개 변수는 자원을 필터링하기위한 것이며 필터 중 하나에 허용되지 않는 값이 제공되었습니다. 나는 이것이 422 Unprocessable Entity closest와 400 Bad Request 두 번째로 가장 가깝다고 생각합니다.
Ryan

jax-rs의 기본 동작은 올바른 동작이기 때문입니다!
jenson-button-event 이벤트

쿼리 문자열 매개 변수가 리소스를 식별하고 값이 제공되었지만 해당 값이 존재하는 리소스에 해당하지 않는 경우 (예 : example.com/show-user를 요청하는 경우) 404를 사용하는 것이 합리적입니다. -profile? user_id = 123 이고 사용자 123이 없습니다. 그러나 그것은이 질문에 대한 것이 아닙니다. 필수 매개 변수가 완전히 생략 된 시나리오에 관한 것입니다. 지정된 리소스에 해당하는 방법을 찾지 못했습니다.
Mark Amery

2

나는 종종 403 Forbidden 오류를 사용합니다. 추론은 요청이 이해되었지만 요청 된대로하지 않을 것입니다 (사실이 잘못 되었기 때문에). 응답 엔티티는 문제점을 설명하므로 응답이 HTML 페이지 인 경우 오류 메시지가 페이지에 있습니다. JSON 또는 XML 응답 인 경우 오류 정보가 있습니다.

에서 RFC2616 :

10.4.4 403 금지

서버가 요청을 이해했지만 요청 이행을 거부하고 있습니다.
승인은 도움이되지 않으며 요청을 반복해서는 안됩니다.
요청 방법이 HEAD가 아니고 서버
가 요청이 이행되지 않은 이유 를 공개 하기를 원한다면 , 엔티티에서 거절 이유를 설명해야한다. 서버가이 정보를 클라이언트가 사용할 수 없게하려면 상태 코드 404
(찾을 수 없음)를 대신 사용할 수 있습니다.


4
당연히 인증이나 권한 기반 오류와 관련이 있지만 처음에는 좋은 소리입니다. 또한이 스펙은 "서버가 클라이언트에이 정보를 제공하지 않으려는 경우"라고 표시합니다. 또한 404가 더 나은 옵션 일 수 있습니다. 나는 403보다 404 또는 400으로 향할 것입니다.
tonyhb

21
기술적으로 건전한 경우에도 이것은 끔찍한 아이디어입니다. 403은 인증 실패 응답에 보편적으로 사용되며 매개 변수 오류를 나타 내기 위해이를 사용하려고 시도하면 클라이언트에서 혼란을 겪게됩니다. 예를 들어 Twitter는이를 수행합니다. 403은 유효하지 않은 OAuth 자격 증명을 제공 할 때와 요청에 의미 상 문제가있을 때 모두 사용되며 API 클라이언트에 대한 지속적인 혼란의 원인입니다.
Matt Zukowski

1
@MattZukowski 잘 맞아요. 사양에이라고 표시 Authorization will not help되어 있으므로 트위터는 잘못된 OAuth 자격 증명을 위해 이것을 보내서는 안됩니다.
torvin

@torvin Twitter가 401 Unauthorized대신 전송해야합니다 . 그러나이 두 코드에 대한 MDN 문서의 설명 을 보면 그 이유가 무엇인지 이해할 수 있습니다 .
Agi Hammerthief

-1

ASP.NET Core를 참조 또는 예제로 사용하기 위해 ASP.NET Core를 사용하면 컨트롤러를 작업으로 스캐 폴딩 할 수 있습니다. 이것이 "세부 사항"작업의 모양입니다.

    // GET: Cars/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
        if (car == null)
        {
            return NotFound();
        }

        return View(car);
    }

매개 변수 id가 설정되지 않으면 404 Not Found를 리턴합니다.


-5

자원을 찾을 수 없음을 의미 하는 404를 리턴하십시오 .

ID가 포함 된 사이트의 URL을 수정하십시오. 나는 몇 가지를 시도했다 :

  • gitub repo 문제
  • 합류 페이지
  • 아마존 제품보기
  • 이베이 리스팅
  • BBC 뉴스 기사

그 개발자들이 표준을 올바르게 해석하고 있기 때문에 404, imo를 반환합니다.


1
필자는 대부분의 개발자가 "매개 변수"를 쿼리 문자열 또는 양식 POST 본문의 이름 / 값 쌍 중 하나로 정의한다고 생각합니다. Github repo 이슈 요청에는 이것을 포함하지 않습니다.
켈빈

@Kelvin 우리는 또한 목록에 경로 매개 변수를 포함시킵니다. url 매개 변수가 필수이고 자원의 위치를 ​​나타내며 포함되지 않은 경우 404를 리턴해야합니다. 이 제외됩니다 requestBody.
jenson-button-event

-6

나는 403과 함께 갈 것입니다.

에서 RFC 2616 - 하이퍼 텍스트 전송 프로토콜 - HTTP / 1.1

403 금지

서버가 요청을 이해했지만 요청 이행을 거부하고 있습니다. 승인은 도움이되지 않으며 요청을 반복해서는 안됩니다. 요청 방법이 HEAD가 아니고 서버가 요청이 이행되지 않은 이유를 공개하기를 원한다면, 엔티티에서 거절 이유를 설명해야한다. 서버가이 정보를 클라이언트가 사용할 수 없게하려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다.

응답에 실패 이유를 설명해야합니다. 원하지 않으면 404를 사용하십시오.


3
이것은 중복 답변이므로 하향 투표되었습니다. 403
사용자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.