자원이 이미 존재하는 경우 POST에 대한 HTTP 응답 코드


842

클라이언트가 객체를 저장할 수있는 서버를 만들고 있습니다. 이러한 객체는 클라이언트 측에서 완전히 구성되며 객체의 전체 수명 동안 영구적 인 객체 ID로 완성됩니다.

클라이언트가 PUT을 사용하여 객체를 만들거나 수정할 수 있도록 API를 정의했습니다.

PUT /objects/{id} HTTP/1.1
...

{json representation of the object}

{id}는 객체 ID이므로 Request-URI의 일부입니다.

이제 클라이언트가 POST를 사용하여 객체를 만들 수 있도록 고려하고 있습니다.

POST /objects/ HTTP/1.1
...

{json representation of the object, including ID}

POST는 "추가"작업을 의미하기 때문에 객체가 이미있는 경우 어떻게 해야할지 모르겠습니다. 요청을 수정 요청으로 취급해야합니까, 아니면 어떤 오류 코드를 반환해야합니까?


5
2016 년 6 월 현재 FB는 이메일이있을 때 등록시 200을 명백히 설정합니다
Green

4
이미 사용중인 이름으로 리소스 (팀 / 리포)를 만들려고하면 Github API가 422를 반환합니다.
Ken

1
객체의 존재를 오류로 간주하는지 여부에 따라 다릅니다. 추가를 처리하는 경우 200 또는 204가 가장 적합한 응답 코드입니다.
Suncat2000

답변:


1055

내 감정이 409 Conflict가장 적절하지만 물론 야생에서는 거의 볼 수 없습니다.

자원의 현재 상태와 충돌하여 요청을 완료 할 수 없습니다. 이 코드는 사용자가 충돌을 해결하고 요청을 다시 제출할 수있는 상황에서만 허용됩니다. 응답 본문에는 사용자가 충돌의 원인을 인식 할 수있는 충분한 정보가 포함되어야합니다. 이상적으로, 응답 엔티티는 사용자 또는 사용자 에이전트가 문제를 해결하기에 충분한 정보를 포함 할 것이다. 그러나 불가능할 수도 있고 필요하지 않을 수도 있습니다.

PUT 요청에 대한 응답으로 충돌이 발생할 가능성이 높습니다. 예를 들어, 버전 관리를 사용 중이고 PUT중인 엔티티에 이전 (타사) 요청으로 작성된 자원과 충돌하는 자원에 대한 변경 사항이 포함 된 경우 서버는 409 응답을 사용하여 요청을 완료 할 수 없음을 표시 할 수 있습니다 . 이 경우 응답 엔티티는 응답 Content-Type에 의해 정의 된 형식으로 두 버전 간의 차이점 목록을 포함 할 수 있습니다.


11
400 나쁜 요청으로 가지 않는 이유는 무엇입니까? 나에게 이것은 유효성 검사 오류처럼 보입니다 (잘못된 ID로 잘못된 페이로드를 제공하고 있습니다).
마누엘 알다 나

314
400 => "잘못된 구문 때문에 서버가 요청을 이해할 수 없습니다 . " 그리고 서버는 완벽하게 이해하지만 충돌로 인해 준수 할 수 없습니다. 요청 및 구문에는 문제가 없으며 데이터 문제 만 있습니다. 400은 즉시 내가 사용하는 전체 메커니즘이 데이터 대신 결함이 있다고 생각하게 만듭니다.
Wrikken

42
@Wrikken 더 이상 맞지 않습니다. HTTP 400은 RFC 7231 에서 " 클라이언트 오류 (예 : 잘못된 요청 구문, 잘못된 요청 메시지 프레이밍 또는기만 요청 라우팅)로 인식 된 것으로 인해 서버가 요청을 처리 할 수 없거나 처리 하지 않을 " 을 의미하도록 변경되었습니다 . 나는 400이 경우 올바른 사용법이다 말하는 게 아니에요하지만 (400)의 새로운 정의와 정확
javajavajavajavajava

19
@javajavajavajavajava : 여전히, 중복 데이터는 내 마음에 '클라이언트 오류'가 아니지만 그것은 보는 사람의 눈에 달려 있습니다.
Wrikken

21
기존 / 충돌 리소스를 가리키는 헤더 HTTP 409와 함께 반환 Location합니다.
Gili

100

따르면 RFC 7231 하는 303 참조 기타 사용될 수있는 후 처리 결과는 기존 자원의 표현에 해당 될 경우 .


4
제 생각에는 이것이 받아 들여질만한 대답 일 것입니다. "MAY"는 완전히 선택적 항목을 나타내지 만 공식 RFC 7231 문서 에서 제안한 유일한 응답 코드 입니다.
Nando

16
이것이 가장 편안한 답변입니다.
세스

6
문맥이 중요하다고 생각합니다. 예를 들어, 303을 반환하면 찾은 리소스로의 리디렉션이 필요합니다. 서버 간 호출에서는 의미가있을 수 있지만 사용자 등록 프로세스를 통해 실행중인 경우 전혀 의미가 없습니다.
Sinaesthetic

11
죄송합니다. HTTP 300은 리디렉션에 관한 것이며 다른 속성을 가진 다른 객체로 리디렉션하는 것은 매우 잘못된 것입니다.
Michael Scheper 2016 년

6
미안할 필요는 없습니다. 그러나 표현이 기존 자원과 동등한 경우 어떻게 다른 특성을 가질 수 있습니까? 그리고 그럴지라도 리디렉션이 어떻게 오도 될 수 있습니까? OP는 말합니다 : 물체가 이미있는 경우 어떻게 해야할지 모르겠습니다. 사실 '동일한'객체입니다. 리디렉션이 왜 오해의 소지가 있습니까? OP의 마음에 분명히없는 다른 물건 에 대해 이야기하고 있습니다.
Nullius

86

개인적으로 WebDAV 확장 프로그램을 사용 422 Unprocessable Entity합니다.

RFC 4918에 따르면

422 Unprocessable Entity상태 코드는 서버가 요청 개체 (그러므로의 콘텐츠 유형을 이해하는 의미 415 Unsupported Media Type상태 코드 부적절), 상기 요청 엔티티의 구문 (따라서 올바른 400 Bad Request상태 코드 부적절) 그러나 포함 지시를 처리 할 수 없습니다.


19
이것은 흥미로운 생각이며 마침내 WebDAV RFC를 읽도록 자극했습니다. 그러나 422의 의미는 요청과 포함 된 엔티티가 구문 적으로 정확하지만 의미 적으로 의미가 없다는 것입니다.
vmj

4
잘못된 형식의 JSON은 구문 상 올바른 엔티티가 아니기 때문에 422제게 이상합니다.
awendt

7
나는 이것으로 가지 않을 것이다. 대답에서 참조 된 동일한 URL에서 : "예를 들어, XML 요청 본문에 올바른 형식 (구문 적으로 올바른)이지만 의미 적으로 잘못된 XML 명령어가 포함 된 경우이 오류 조건이 발생할 수 있습니다." 이것은 유효한 구문과 의미로 완전히 유효한 요청 엔터티를 보내는 경우와 달리 처리 할 수없는 엔터티의 실제 의미이지만 기존 엔터티와 충돌하는 유일한 문제입니다. 실제로, 요청 엔티티의 의미가 유효하지 않은 경우, 유사한 기존 엔티티가 전혀 없어야합니다.
Tamer Shlash

1
Tamer 주석에 추가하여 두 번째 요청이 먼저 발생하면 성공할 것입니다. 의미가 맞으면 불가능합니다. 따라서 올바른 의미의 경우 여기에 적용되지 않습니다.
Harish

4
@Tamer 왜 그래? "개체 xy 작성하십시오"명령은 구문 상 정확합니다. 객체 xy를 생성 할 수있는 경우에만 의미 론적으로 정확합니다. 객체 xy가 이미 존재하면 더 이상 객체를 생성 할 수 없으므로 의미 상 오류입니다.
Hagen von Eitzen

47

그것은 모두 context 에 관한 것이며 요청의 서버 (클라이언트 또는 클라이언트 또는 둘 다)를 처리하는 담당자


서버 가 복제본을 가리키면 4xx를보십시오.

  • 400 잘못된 요청-명백한 클라이언트 결함으로 인해 서버가 요청을 처리하지 않는 경우
  • 409 충돌-서버가 요청을 처리하지 않지만 그 이유가 클라이언트의 결함이 아닌 경우
  • ...

중복을 암시 적으로 처리 하려면 2XX를보십시오.

  • 200 OK
  • 201 만든
  • ...

서버가 무언가를 리턴 할 것으로 예상되면 3XX를보십시오.

  • 302 발견
  • 303 다른 참조
  • ...

서버가 기존 리소스를 가리킬 수 있으면 리디렉션을 의미합니다.


위의 방법으로 충분하지 않은 경우 항상 응답 본문에 오류 메시지를 준비하는 것이 좋습니다.


2
요청이 리소스를 복제하지 않고 데이터를 추가하고 있습니다. 내 의견으로는, 당신의 모든 것이 최고의 답변입니다.
Suncat2000

28

게임에 늦었을 수도 있지만 REST API를 만들려고 할 때이 시맨틱 문제를 발견했습니다.

Wrikken의 답변을 조금 확장하려면 상황에 따라 409 Conflict또는 403 Forbidden상황에 따라 사용할 수 있다고 생각합니다 . 즉, 사용자가 충돌을 해결하고 요청을 완료하기 위해 아무것도 할 수없는 경우 403 오류를 사용하십시오 (예 : DELETE명시 적으로 리소스를 제거하도록 요청하거나, 가능한 경우 409를 사용하십시오.

10.4.4 403 금지

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

요즘 누군가가 "403"이라고 말하고 권한 또는 인증 문제가 떠오른다. 그러나 스펙은 기본적으로 서버가 클라이언트에게 요청하지 않을 것이라고 알리고 다시 묻지 말고 클라이언트가 '티.

PUTvs. POST...에 관해서 POST는 사용자가 리소스에 대한 식별자를 만들거나 수단을 만들지 않아야 할 때 리소스의 새 인스턴스를 만드는 데 사용해야합니다. PUT자원의 아이덴티티가 알려진 경우에 사용됩니다.

9.6 퍼트

...

POST와 PUT 요청의 근본적인 차이점은 Request-URI의 다른 의미에 반영됩니다. POST 요청의 URI는 동봉 된 엔터티를 처리 할 리소스를 식별합니다. 이 리소스는 데이터 수락 프로세스, 다른 프로토콜의 게이트웨이 또는 주석을 허용하는 별도의 엔티티 일 수 있습니다. 반대로 PUT 요청의 URI는 요청으로 둘러싸인 엔티티를 식별합니다. 사용자 에이전트는 의도 된 URI를 알고 있으며 서버는 요청을 다른 자원에 적용해서는 안됩니다. 서버가 요청을 다른 URI에 적용하기를 원하는 경우,

반드시 301 (영구적으로 이동) 응답을 보내야합니다. 그런 다음 사용자 에이전트는 요청을 리디렉션할지 여부에 대한 자체 결정을 내릴 수 있습니다.


7
403 Forbidden 은 사용자가 인증 되었지만 요청 된 작업을 실행할 권한 이 없음을 의미 한다고 생각 합니다. 유효성 검사 오류에는 사용하지 않습니다. : 로그인하지 않은 상태에서 무언가를 삭제하려고합니다. 서버가 401 Unauthorized (잘못된 이름으로 401 Unauthenticated )를 보내 줍니다. 로그인 한 후 다시 시도하십시오. 이번에는 서버가 내 권한을 확인하고 허용되지 않음을보고 403 Forbidden을 반환합니다 . 이 질문 도 참조하십시오 .
Stijn de Witt

흠 ... 사실. 여기에 대한 생각은 권한 부여가 OP의 유스 케이스에서 자원을 불변으로 만든다는 것을 사용자에게 알리는 것입니다. 이미 존재합니다. 충돌을 해결하기 위해 아무것도 할 수 없으며 자원을 다시 작성하지 마십시오.
p0lar_bear

3
사양에 따르면, 오류 가 대상 리소스POST 와 충돌 할 때 반환되어야하므로 오류 409가 요청에 의해 반환 될 수 없음을 의미합니다 (올바르게 사용 된 경우) . 대상 리소스가 아직 게시되지 않았기 때문에 충돌 가능성 이 없으므로 회신 할 수 없습니다. 409 Conflict
Grant Gryczan

1
나는 409 오류가로 반환 될 수 없다고 추론하지 않을 것이다 POST. 사실 " PUT 요청에 대한 응답으로 충돌이 발생할 가능성이 높기 때문에"그 반대의 경우를 추론 할 것이다 . 다른 요청 메소드 도이 코드를 사용할 수 있음을 나타냅니다. 또한 "응답 본문 에는 사용자가 충돌의 원인을 인식 할 수있는 충분한 정보 포함되어 있어야합니다 . 이상적으로 응답 엔터티에는 사용자 나 사용자 에이전트가 문제를 해결하기에 충분한 정보가 포함되어 있습니다. " 필요하지 않습니다 ." ( webdav.org/specs/rfc2616.html#status.409 )
JWAspin

14

"302 Found"가 논리적으로 들립니다. 그리고 RFC 2616는 이 GET 및 HEAD 이외의 요구에 대한 응답 (이 반드시 POST 포함) 될 수 있음을 말한다

그러나 여전히 RFC에 의해이 "발견 된"리소스를 얻기 위해 방문자가이 URL로 이동합니다. 실제 "발견 된"URL로 직접 이동하려면 "303 See Other"를 사용해야합니다. 그러나 다른 호출은 다음 URL을 GET으로 강제합니다. 좋은 점에서이 GET은 캐시 가능합니다.

나는 "303 See Other"를 사용할 것이라고 생각한다 . 본문에있는 "사물"로 응답 할 수 있는지 모르겠지만 서버에 한 번의 왕복을 저장하려고합니다.

업데이트 : RFC를 다시 읽은 후에도 존재하지 않는 "4XX + 303 Found"코드가 올바른 것으로 생각합니다. 그러나 "409 충돌"은 기존 자원을 가리키는 Location 헤더를 포함하여 (@Wrikken이 지적한) 최상의 기존 응답 코드 입니다.


88
3xx 등급은 리디렉션을위한 것입니다
Aviram Netanel

1
"요청한 자원이 일시적으로 다른 URI에 있습니다." 에서 w3.org/Protocols/rfc2616/rfc2616-sec10.html
statueofmike

1
IMHO, "307 Temporary Redirect"는 실제 임시 리디렉션입니다. "302"는 모호하지만 "FOUND !!" 정말 원하는 메시지입니다. 가장 명백한 절충안은 HTTP 의미론에서 "303 See Other"입니다. 나는 "303 See Other"로 갈 것이다.
alanjds

@DavidVartanian Hum ... 여기에 오류가 표시되지 않습니다. 클라이언트가 올바른 요청을 보냈지 만 "죄송하지만 여기서 만들려는 것이 이미 있습니다"라고 말하는 방법은 무엇입니까? 3xx 정도의 직업인 것 같습니다. 클라이언트 오류가 없으므로 4xx가 아닙니다.
alanjds

1
@DavidVartanian 토론 해 주셔서 감사합니다. 409쪽으로 답변을 업데이트했습니다 . 클라이언트는 불가능하다는 것을 모르더라도 불가능한 것을 요구하는 것은 잘못입니다.
alanjds

11

나는 당신이 이것을해야한다고 생각하지 않습니다.

아시다시피 POST는 컬렉션을 수정하고 새 항목을 만드는 데 사용됩니다. 따라서 ID를 보내면 (좋은 생각이 아닌 것 같습니다) 컬렉션을 수정해야합니다. 즉, 항목을 수정해야하지만 혼란 스럽습니다.

ID없이 항목을 추가 할 때 사용하십시오. 모범 사례입니다.

PUT 요청에서와 같이 UNIQUE 제약 조건 (ID가 아닌)을 캡처하려는 경우 409로 응답 할 수 있습니다. 그러나 ID는 아닙니다.


조인 테이블 관계가있는 개체는 어떻습니까? account, product 및 account_product가 데이터베이스 테이블로 있다고 가정하십시오. 계정에 제품을 추가하고 싶어서 product_id를 사용하여 / account / {id} / product에 게시하고 싶습니다. 하나의 계정-제품 관계 만 허용되면 무엇을 반환해야합니까?
partkyle

2
데이터베이스 테이블을 잊어 버리십시오. 제품이 계정과 만 관련 될 수 있다고 가정 해 봅시다. 그러면 그것은 일대 다 관계입니다. 따라서 { 'account': account_id}와 함께 / product / {id}를 POST하십시오. 최대 카디널리티를 '1'(일대일 관계)로 설정 한 경우 왜 나머지 개체가 분리됩니까? 카디널리티 오류는 400 오류입니다. 간단하게 유지하십시오. 나는 당신의 질문을 이해하기를 바랍니다.
Alfonso Tienda

방금이 질문을 제기했으며 ID는 데이터베이스의 기술적 ID가 아니라 회사 코드와 같은 것입니다. 이 응용 프로그램에서 관리자 사용자는 회사를 만들 수 있으며 코드를 제공해야합니다. DB 테이블에도 기술 ID가 있다는 사실에도 불구하고 사용자의 회사 ID입니다. 내 경우에는 동일한 회사 코드가 이미 존재하면 409를 반환합니다.
AlexCode

@partkyle PK를 공개 ID로 사용하지 마십시오 !!
Sinaesthetic

일부 엔터티에는 ID뿐만 아니라 고유 한 제약 조건이 있습니다. 사용자가 사용자 이름을 제공하지 않으면 계정처럼 계정을 만들 수 없습니다. 그리고 사용자 이름이없는 계정을 추가하는 것은 명백히 불가능합니다
rocketspacer

9

나는 422 Unprocessable Entity요청이 유효하지 않지만 문제가 구문이나 인증에없는 경우에 사용됩니다.

다른 답변에 대한 논쟁으로, 4xx오류가 아닌 코드 를 사용 한다는 것은 클라이언트 오류가 아니라는 것을 의미합니다. 4xx오류 가 아닌 코드 를 사용하여 클라이언트 오류를 ​​나타내는 것은 전혀 의미가 없습니다.

것 같다 409 Conflict여기에서 가장 일반적인 대답 인 사양에 따르면 리소스가 이미 존재하고 적용하는 새 데이터가 현재 상태와 호환되지 않음을 의미합니다. 당신이 보내는 경우POST예를 들어 이미 생성 된 사용자 이름으로 요청하면 대상 리소스 (생성하려는 리소스)가 아직 게시되지 않았으므로 실제로 타겟 리소스와 충돌하지 않습니다. 저장된 리소스 버전과 요청 된 리소스 버전간에 충돌이있는 경우 특히 버전 제어에 오류가 발생합니다. 예를 들어 클라이언트가 이전 버전의 리소스를 캐시하고 더 이상 조건부로 유효하지 않은 잘못된 버전을 기반으로 요청을 보내는 경우와 같이 이러한 목적에 매우 유용합니다. "이 경우 응답 표현에는 수정 내역에 따라 차이를 병합하는 데 유용한 정보가 포함되어있을 것입니다." 해당 사용자 이름으로 다른 사용자를 작성하라는 요청은 처리 할 수 ​​없으며 버전 제어와 관련이 없습니다.

레코드의 경우 422는 이미 사용중인 이름으로 리포지토리를 만들 때 GitHub가 사용하는 상태 코드입니다.


422는 webdav 사양이므로 REST API에는 사용하지 않는 것이 좋습니다
rwenz3l

7

REST에 대해서는 특정 시스템의 동작에 대한 결정을 내려야한다고 생각합니다.이 경우 "올바른"답변이 여기에 주어진 몇 가지 답변 중 하나라고 생각합니다. 클라이언트가 계속하기 전에 수정해야 할 실수를 한 것처럼 요청을 중지하고 동작하려면 409를 사용하십시오. 충돌이 실제로 중요하지 않고 요청을 계속 진행하려면 응답을 리디렉션하여 응답하십시오. 발견 된 엔티티에 대한 클라이언트. 적절한 REST API가 POST 이후에 해당 리소스의 GET 끝점으로 리디렉션 (또는 적어도 위치 헤더를 제공해야 함)해야한다고 생각 하므로이 동작은 일관된 경험을 제공합니다.

편집 : ID를 제공하기 때문에 PUT을 고려해야한다는 점도 주목할 가치가 있습니다. 그리고 나서 행동은 간단합니다. "지금 거기있는 것은 상관 없어요. 의미가 없다면 아무것도 만들어지지 않을 것입니다. 무언가가 있으면 교체됩니다. 서버가 해당 ID를 관리 할 때 POST가 더 적합하다고 생각합니다. 두 개념을 분리하면 기본적으로 그것을 다루는 방법을 알 수 있습니다 (즉, PUT은 dem 등원이므로 페이로드가 검증되고 POST가 항상 생성되므로 ID 충돌이 있으면 409가 충돌을 설명합니다) .


사양에 따르면 , 대상 리소스POST 와 충돌 할 때 반환되어야하므로 오류 (409)가 요청 (올바르게 사용 된 경우)에 의해 반환 될 수 없음을 암시 합니다 . 대상 리소스가 아직 게시되지 않았으므로 충돌 할 수 없으므로 회신 할 409 Conflict수 없습니다.
Grant Gryczan

논쟁의 여지가있는 imo. / users에 게시하면 리소스는 개별 레코드 / users / {id} 대신 모음입니다.
Sinaesthetic

저장된 리소스 버전과 요청 된 리소스 버전간에 충돌이있는 경우 특히 버전 제어에 오류가 발생합니다. 예를 들어 클라이언트가 이전 버전의 리소스를 캐시하고 더 이상 조건부로 유효하지 않은 잘못된 버전을 기반으로 요청을 보내는 경우와 같이 이러한 목적에 매우 유용합니다. "이 경우 응답 표현에는 수정 내역에 따라 차이를 병합하는 데 유용한 정보가 포함되어있을 것입니다."
Grant Gryczan

그래도 당신의 제안을 좋아합니다 PUT.
Grant Gryczan

4

또 다른 잠재적 치료법은 PATCH를 사용하는 것입니다. PATCH는 내부 상태를 변경하는 것으로 정의되며 추가로 제한되지 않습니다.

PATCH는 기존 항목을 업데이트하여 문제를 해결합니다. 참조 : RFC 5789 : 패치


2
패치는 PUT과 유사하지만 완전한 교체는 아닙니다. 자원의 전체를 교체하는 대신 단일 자원 요소를 추가, 제거 또는 수정하는 것과 같은 자원을 수정하는 데 사용됩니다.
Sinaesthetic

4

202가 허용 되지 않습니까? OK 요청 (200s)이며 클라이언트 오류 (400s)는 없습니다.

에서 10 개 상태 코드 정의 :

"202 수락되었습니다. 처리 요청이 승인되었지만 처리가 완료되지 않았습니다."

... 이미 존재했기 때문에 완료 할 필요가 없기 때문에. 고객은 이미 존재한다는 것을 알지 못하고 잘못한 것이 없습니다.

202를 던지고 GET /{resource}/{id}이 반환 한 것과 비슷한 내용을 반환하려고합니다 .


21
이 답변은 잘못되었습니다. 202는 서버가 요청에서 문제점을 찾지 못했지만 응답 후 요청을 처리하도록 선택했음을 의미합니다. 또한 처리가 성공할 것으로 예상 함을 의미합니다. 우리의 경우 서버는 처리가 실패한다는 것을 알고 있으므로 202는 잘못된 응답입니다.
Adrian

4
202의 예는 큐 또는 구독입니다. 즉,이 순간에 바로 요청하면 요청 결과를 즉시 사용할 수 없습니다.
Sinaesthetic

1
서버가 여전히 요청을 처리하는 경우에 적합합니다. 200 또는 204가 더 일반적입니다. OP가 추가 요청을하기 때문에 오브젝트의 존재는 예상 된 조건이며 오류가 아닙니다.
Suncat2000

요청이 수락 되지 않았 음 을 이미 알고 있기 때문에 요청이 수락되었다고 클라이언트에게 말하는 것은 의미 가 없습니다!
lucastamoios

1
@Adrian과 lucastamoios 응답을 제공하기 전에 서버가 데이터베이스에서 동기식으로 읽는다고 가정합니다. 항상 그런 것은 아니므로 서버가 기존 레코드를 항상 "알지"않기 때문에이 답변은 "잘못된"것이 아닙니다. 이것은 API 계층이 단순히 백그라운드 워커에 의한 처리 요청을 기록하는 비동기 시스템의 경우에 해당됩니다.
gsaslis

2

중복 레코드의 올바른 코드를 확인하는 동안이 질문에 우연히 발견되었습니다.

내 무지를 용서하지만 모든 사람이 왜 "다중 선택"또는 "모호함"이라는 코드 "300"을 무시하는지 이해하지 못합니다.

내 생각에 이것은 비표준 또는 특정 시스템을 구축하기위한 완벽한 코드 일 것입니다. 나도 틀렸어!

https://tools.ietf.org/html/rfc7231#section-6.4.1


내 이해 : "상태 코드는 대상 자원에 둘 이상의 표현이 있음을 나타냅니다. 대안에 대한 정보가 제공되어 사용자 (또는 사용자 에이전트)가 요청을 하나 이상의 해당 표현으로 리디렉션하여 선호하는 표현을 선택할 수 있습니다. Google은 하나 이상의 표현을 방지하기 위해 노력하고 있습니다. 옵션이 없습니다. 클라이언트가 선택할 수있는 대안은 없습니다. 클라이언트는 다른 ID로 다시 제출해야합니다. 따라서 클라이언트 대 서버에서 고유 한 ID를 생성해야하는지 여부도 고려해야합니다.
musicin3d 2012

의미 상 클라이언트는 "Create this"라고 말하고 서버는 "대신 Go here"라고 말하여 응답합니다. 대화는 말이되지 않습니다. 마치 서버가 클라이언트에게 "대신이 위치에 게시"하라고 지시하는 것과 거의 같습니다. 서버가 "Ok I it it it and it 's here"로 응답하는 경우 300은 GET 요청 또는 POST에 더 적합한 응답입니다.
Sinaesthetic

2

더 가능성이 높습니다 400 Bad Request

6.5.1. 400 잘못된 요청


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

요청에 중복 값 (이미 존재하는 값)이 포함되어 있으므로 클라이언트 오류로 인식 될 수 있습니다. 다음 시도 전에 요청을 변경해야합니다.
이러한 사실을 고려하여 HTTP STATUS 400 잘못된 요청으로 결론을 내릴 수 있습니다.


1
잘못된 요청은 패킷 구문에 내재 된 문제가 있음을 의미합니다. 다른 컨텍스트 (예 : 이미 존재하지 않는 리소스)에서 패킷이 성공하면 오류 400을 반환하지 않아야합니다.
Grant Gryczan

1

208- http : //httpstatusdogs.com/208-already-reported는 어떻습니까? 그게 옵션인가요?

내 의견으로는, 유일한 것이 반복 리소스라면 오류가 발생하지 않아야합니다. 결국, 클라이언트 측이나 서버 측 모두에 오류가 없습니다.


ID가 이미 존재하는 특정 항목을 추가하려는 경우 옵션이 없습니다. 그래서 당신은 무언가를 추가하려고 시도하지만 이것은 이미 있습니다. OK는 데이터 세트가 증가 된 경우에만 적용됩니다. 뭔가 추가-> 좋아, 나는 아무것도 추가하지 않았다. 맞지 않는 것 같아요.
Martin Kersten

내가 말했듯이, 나는 이것이 오류가 아닙니다. 그러나 @martin의 요점을 보았습니다
Fernando Ferreira

리소스가 성공적으로 생성되지 않으면 정의상 오류가 있습니다.
Grant Gryczan

POST는 데이터 추가에도 사용됩니다. 이것은 오류가 아니라 정의의한 것 입니다.
Suncat2000

@ Suncat2000이 경우에도 데이터가 성공적으로 추가되지 않은 경우에도 여전히 오류가 있습니다. 리소스가 이미 존재하는 경우 데이터가 추가되지 않습니다.
Grant Gryczan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.