답변:
상태 422는 사양 에 따라 가장 적합한 것으로 보입니다 .
422 (처리 할 수없는 엔티티) 상태 코드는 서버가 요청 엔티티의 컨텐츠 유형을 이해하므로 (415 (지원되지 않는 매체 유형) 상태 코드가 부적절 함) 요청 엔티티의 구문이 정확함 (따라서 400 (잘못된 요청) ) 상태 코드는 부적절하지만 포함 된 지침을 처리 할 수 없습니다. 예를 들어, XML 요청 본문에 올바른 형식 (구문 적으로 올바른)이지만 의미 상 잘못된 XML 명령어가 포함 된 경우이 오류 조건이 발생할 수 있습니다.
그들은 잘못된 XML이 잘못된 구문의 예라고 말합니다 (400을 호출 함). 잘못된 형식의 쿼리 문자열은 이와 유사 해 400이 매개 변수가없는 올바른 형식의 쿼리 문자열에 적합하지 않은 것 같습니다.
@DavidV 업데이트 는이 사양이 핵심 HTTP가 아닌 WebDAV에 대한 것임을 올바르게 지적합니다. 그러나 일부 인기있는 WebDAV API는 더 나은 상태 코드가 없기 때문에 어쨌든 422를 사용하고 있습니다 ( this 참조 ).
400
더 적절 하다고 생각 합니다.
표준 설정이 확실하지는 않지만 최신 HTTP 사양 (2014 년부터) 으로 다음과 같은 400 Bad Request를 사용했을 것입니다 .
6.5.1. 400 잘못된 요청400 (잘못된 요청) 상태 코드는 클라이언트 오류 (예 : 잘못된 요청 구문, 잘못된 요청 메시지 프레이밍 또는 사기성 요청 라우팅)로 인식되는 것으로 인해 서버가 요청을 처리 할 수 없거나 처리하지 않음을 나타냅니다.
400 Bad Request
의미 적 오류가 아닌 프로토콜 수준 문제를 나타냅니다. 프로토콜 수준이 아닌 응용 프로그램 수준 오류를 나타 내기 위해 HTTP 상태 코드를 가로 채려고한다면 412
어떻게해야합니까?
.NET 의 WCF APIHTTP 404
는 webHttpBinding을 사용할 때 "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 잘못된 요청
잘못된 구문으로 인해 서버에서 요청을 이해할 수 없습니다. 클라이언트는 수정없이 요청을 반복해서는 안됩니다.
API 프로젝트 중 하나에서 매개 변수 누락으로 인해 100 %로 완전히 채울 수없는 경우 일부 요청에 409 상태를 설정하기로 결정했습니다.
HTTP 상태 코드 "409 충돌"은 사용자가 충돌의 원인을 인식 할 수 있도록 충분한 정보를 포함해야하기 때문에 좋은 시도였습니다.
참조 : w3.org/Protocols/
따라서 400 또는 404와 같은 다른 응답 중에서 409를 선택하여 새 올바른 요청을 설정하는 데 도움이되는 요청에서 메모를 살펴볼 필요성을 강제했습니다.
어떤 식 으로든 요청이 완전히 정확하지 않은 경우 일부 데이터를 보내야하므로 클라이언트가 메시지를보고 요청에서 무엇이 잘못되었는지 이해하도록 강제해야합니다.
일반적으로 누락 된 매개 변수 만있는 경우 400 및 누락 된 매개 변수 배열 로 이동합니다 . 그러나 특정 사례 메시지와 같은 추가 정보를 보내야 할 때 클라이언트가 처리 할 것인지 더 확실하게 확인하려면 409를 보냅니다.
필요한 매개 변수의 항목이 API 엔드 포인트가 요구하는 것과 일치하지 않지만 (너무 짧은 암호와 같은) 누락 된 매개 변수의 경우 406 (허용되지 않음)이됩니다.
Accept-Language: de
은 독일어로만 응답을 표시하지만 서버에서 사용할 수있는 요청 된 문서의 유일한 버전은 영어 또는 프랑스어로되어 있음을 나타내는 요청이 포함되어 있습니다. 요청에서 누락 된 매개 변수를 나타내는 데 사용하는 것은 올바르지 않습니다. 사양의 정의에 따라.
관심있는 사람들을 위해 Spring MVC (3.x 이상)는이 경우 400을 반환하는데, 이는 나에게 잘못된 것 같습니다.
여러 Google URL (accounts.google.com)을 테스트하고 필수 매개 변수를 제거했으며이 경우 일반적으로 404를 반환합니다.
Google을 복사하겠습니다.
404 Not Found
지정된 자원을 찾을 수 없으므로 a를 사용해야 한다고 주장 할 수 있습니다 .
나는 종종 403 Forbidden 오류를 사용합니다. 추론은 요청이 이해되었지만 요청 된대로하지 않을 것입니다 (사실이 잘못 되었기 때문에). 응답 엔티티는 문제점을 설명하므로 응답이 HTML 페이지 인 경우 오류 메시지가 페이지에 있습니다. JSON 또는 XML 응답 인 경우 오류 정보가 있습니다.
에서 RFC2616 :
10.4.4 403 금지
서버가 요청을 이해했지만 요청 이행을 거부하고 있습니다.
승인은 도움이되지 않으며 요청을 반복해서는 안됩니다.
요청 방법이 HEAD가 아니고 서버
가 요청이 이행되지 않은 이유 를 공개 하기를 원한다면 , 엔티티에서 거절 이유를 설명해야한다. 서버가이 정보를 클라이언트가 사용할 수 없게하려면 상태 코드 404
(찾을 수 없음)를 대신 사용할 수 있습니다.
Authorization will not help
되어 있으므로 트위터는 잘못된 OAuth 자격 증명을 위해 이것을 보내서는 안됩니다.
401 Unauthorized
대신 전송해야합니다 . 그러나이 두 코드에 대한 MDN 문서의 설명 을 보면 그 이유가 무엇인지 이해할 수 있습니다 .
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를 리턴합니다.
자원을 찾을 수 없음을 의미 하는 404를 리턴하십시오 .
ID가 포함 된 사이트의 URL을 수정하십시오. 나는 몇 가지를 시도했다 :
그 개발자들이 표준을 올바르게 해석하고 있기 때문에 404, imo를 반환합니다.
requestBody
.
나는 403과 함께 갈 것입니다.
에서 RFC 2616 - 하이퍼 텍스트 전송 프로토콜 - HTTP / 1.1
403 금지
서버가 요청을 이해했지만 요청 이행을 거부하고 있습니다. 승인은 도움이되지 않으며 요청을 반복해서는 안됩니다. 요청 방법이 HEAD가 아니고 서버가 요청이 이행되지 않은 이유를 공개하기를 원한다면, 엔티티에서 거절 이유를 설명해야한다. 서버가이 정보를 클라이언트가 사용할 수 없게하려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다.
응답에 실패 이유를 설명해야합니다. 원하지 않으면 404를 사용하십시오.