2009-09-22 9 views
6

동료들과 저는 여러 가지 RESTful HTTP 서비스를 구현하고 있으며 우리는 다음과 같은 사양을 갖추고 있는지 확인하려고 노력하고 있습니다. b) "올바른"일을하고 있습니다. 여기서 스펙은 세부 사항에 부족합니다.RESTful PUT의 불가분성에 대한 의견

하는 것은 당신이이 자원/사람/밥, 당신의 클라이언트가 PUT로 업데이트하는 것입니다 있다고 가정하자 : 여기

은 우리가 온과에 대한 지역 사회의 의견을 찾고있다 특정 상황입니다. 서버는 application/json 및 text/html에서/People/Bob에 대한 표현을 생성 할 수 있습니다. 서버는 application/json에서/People/Bob에 대한 표현을 해석 할 수 있습니다. 이 요청을 감안할 때

:

 
PUT /People/Bob 
Content-Type: application/json 
Accept: application/xml 

{ name: "Still Bob" } 

서버가 XML 표현을 생성 할 수 없지만 들어오는 JSON을 처리 할 수 ​​있습니다. 따라서 서버가 상태 406을 반환 할 정확한 대답을 알고 있습니다.

질문 : 서버가/People/Bob에 대한 업데이트를 수행 했습니까?

+1

이전 StackOverflow 질문에 대한 대답은 도움이 될 수 있습니다. http://stackoverflow.com/questions/982351/alternative-bodies-for-http-put/984436#984436 –

+0

감사합니다, Matt. 그 스레드가 Content-Type 대 Accept (및 406 대 415)에 대해 혼란스러운 점을 분명히 해줍니다. 여기서 내가 요구하는 것은 사양이 약간 짧아 보이는 것 때문에 요청을 처리하는 원 자성입니다. – user30921

답변

2

+1 for Philosophy of REST.

HTTP 사양에 대한 자세한 지식이 없으면 간단히 옵션 중 하나를 선택하고 난제와 선택 사항을 문서화합니다.

내가 선호하는 것은 서버가 요청에 따라 응답 할 수 없다는 것입니다. 그런 다음 요청을 전혀 처리하지 않아야합니다.

그러나 일부 시나리오에서는 작동하지 않을 수 있으므로 그 반대 일 수 있습니다.

+0

안녕하세요, 감사합니다.우리는 REST의 가장 진실한 구현을 가지고 돌아가는 데 매우 치명적입니다. 나는이 방향 (전체 요청을 보석 함)에 기대고 있으며, 나를 붙잡고있는 주된 일은 우리 엔진 hehehehe의 한 섹션을 다시 써야한다는 것입니다. – user30921

+0

응답 해 주신 모든 분들께 감사드립니다. 나는 그저 게으르지 않으면 우리가 전체 요청에 실패 할 것이라고 생각한다. – user30921

1

나는 이론에서는 '예'라고 논 하겠지만, 실제 적용에는 '아니오'라고 논쟁 할 것이다.

오류가있는 경우 로직을 처리하지 않습니다. 여러분이 500이 아닌 406을 반환 했으므로, 제가 제공 한 데이터에 오류가있는 것이 아니라 결과가 내게 제공되는 방식에 있음을 알았습니다.

즉, 일부 응용 프로그램에서는 오류 코드를 확인하지 않습니다. 그들은 요청한 XML이 아니라 오류가 발생하여 트랜잭션이 실패했다고 가정합니다.

응용 프로그램/xml이 실제 문제가 아니라고 가정합니다. 그러나 문제의 목적을 위해 - 실제로 이것이 실제 서비스로 배포되고 있다면 거의 확실하게 가장 일반적인 RESTful 상호 작용 인 (필자가 생각하기에) XML 표현인데, 많은 호출자는 아마도 XML을 사용하기 위해 하드 코딩되어있을 것이다.

요약 : 실제로 application/xml을 제공하지 않으면 업데이트를 수행하지 말 것입니다. 당신은 모든 기준을 취급하고 있지만 당신은 사용자가 다음 가서, 응용 프로그램/fooSomethingNonStandard 요청 및 업데이트를 수행하지만, 당신이 406

+0

의견에 감사드립니다. 질문은 XML 또는 특정 형식에 관한 것이 아닙니다. 우리는 표현을 선택하는 엔진이 요청을 처리하기 전이나 후에 Accept 유형을 검사해야하는지 결정하려고합니다. 요청이 끝날 때 (지금 우리가하는) 요청을하면 대답은 '예'입니다. 요청 시작시이를 수행하면 '아니오'라고 응답합니다. – user30921

2

로 응답해야 할 비상 계획하는 경우 질문 : 서버가/People/Bob에 대한 업데이트를 수행 했습니까?the HTTP spec 가입일

, 406 개 방법 :

요청에 의해 식별되는 자원 요청 전송 된 승인 헤더에 따라 허용 가능한 컨텐츠를 가지는 Response만을 생성 할 수있다.

HEAD 요청이 아닌 한, 응답에는 사용자 또는 사용자 에이전트가 가장 적합한 것을 선택할 수있는 사용 가능한 엔터티 특성 및 위치의 목록을 포함하는 엔터티가 포함되어야합니다 (SHOULD). 엔티티 형식은 Content-Type 헤더 필드에 지정된 미디어 유형으로 지정됩니다. 사용자 에이전트의 형식과 능력에 따라, 가장 적절한 선택의 선택은 자동적으로 수행 될 수있다. 그러나이 규격은 그러한 자동 선택을위한 표준을 정의하지 않는다. 응답을 접수 할 수 없을

Note: HTTP/1.1 servers are allowed to return responses which are 
    not acceptable according to the accept headers sent in the 
    request. In some cases, this may even be preferable to sending a 
    406 response. User agents are encouraged to inspect the headers of 
    an incoming response to determine if it is acceptable. 

, 사용자 에이전트는 잠정적으로 더 이상의 데이터를 수신하지 말아야하며 추가 행동을 취할 것인지 사용자에게 질의한다.

중간에 HTTP/1.1에 대한 메모가 답변이 될 수 있습니다. "사용자 에이전트가 Accept 헤더에서 application/xml을 지정하고 적합한 컨텐트 유형을 선택하면이/People/Bob에 대한 PUT 요청에 대한 응답으로 200을 반환 할 수 있으며이 결과는 다음과 같이 적합 할 수 있습니다. (406)

이 시나리오에서 PUT은 서버에서 성공하지만 200을 반환하지만 클라이언트는 응용 프로그램/json 표현을 얻습니다. 클라이언트는 Content-type 헤더에 주어진 미디어 유형을 이해하고 그렇지 않은 경우 잘 정의 된 방식으로 작동하는지 확인하여 이러한 가능성을 처리 할 수 ​​있어야합니다.

그러나 이것은 항상 사실입니다.

한 가지 더 : application/xml 및 application/json과 같은 일반 바닐라 미디어 유형을 사용하지 말고 대신 XHTML 또는 JSON을 기반으로하는 사용자 지정 미디어 유형을 정의 할 수 있습니다. client-server coupling in a RESTful application은 모두 미디어 유형을 통해 발생합니다. 도메인 개념을 포착 할만큼 풍부한 미디어 유형이 없으면 REST API를 완벽하게 지정하지 못합니다.

+0

감사합니다. 매우 기민한 관찰이었습니다. 나는이 대답 (내 동료 중 한 명이 배트에서 제안한 것)과 함께 가고 싶지만, 클라이언트에게 무언가를 쓸모없는 것으로 돌려 보내는 것에 대해 기분이 들지 않는다. 미디어 유형에 대한 조언을 주셔서 감사하지만이 예제에서 선택한 바닐라는 단지 미디어 유형의 모든 조합에 적용됩니다. – user30921

+0

이것은 피하는 것이 가장 좋은 클라이언트와 서버 간의 연결 유형처럼 들리기 시작합니다. 서버를 XML 출력으로 장비하거나 클라이언트에 JSON 입력을 장비하는 것이 얼마나 타당할까요? 대답이 "그다지"아니라면 요청을 실패하고 서버가 업데이트되지 않았 음을 명확하게 나타내는 400을 반환하는 방법은 무엇입니까? –

1

귀하의 수수께끼에서 벗어나려면 PUT이 204 (콘텐츠 없음)를 반환해야합니다. 그런 식으로 클라이언트의 Accept 헤더는 업데이트 수행 여부와 관련이 없습니다.

"RESTful"(또는 적어도 "HTTP-embracing") 클라이언트는 현재 "페이지"를 업데이트하지 않는다는 것을 알게되고 GET을 수행해야합니다. 의지. GET에있는 Accept 헤더는 이제 업데이트 원자력과는 별개의 문제입니다.

+0

의견을 보내 주신 데 대해 감사드립니다.하지만 아키텍처에서는 PUT이 클라이언트 측 서버 측 변경 사항, 유효성 검사 업데이트 및 유효성 검사 메시지를 전달하는 가장 효율적인 방법 인 응답 본문을 허용합니다 (422의 본문 포함). 우리는 검증 실패를 위해 사용한다). – user30921

+0

@ 크리스, 네가 너무 멀다고 생각 했어. :) 그리고 확실히 추가 요청 - 응답을 피하고 싶다는 것을 이해합니다. 이 답변은 비슷한 질문에 직면하고 다른 요구 사항을 가진 다른 사람들에게 유용 할 것이라고 생각했습니다. –

0

나는 Rich가 제안한 방법 또는 406을 사용하여 성공하고 200을 반환하고 실패합니다. 이 프로토콜은 2xx (성공)와 4xx (오류) 코드를 섞어서 더 뉘앙스가없는 접근을 허용하지 않으므로 4xx가 성공하지 못했다는 의미로 읽힐 수 있습니다.

관련 문제