2009-08-24 3 views
1

저는 REST 인터페이스를 설계하고 있는데 삽입/업데이트/삭제 동사가 반환해야하는 내용 (응답의 내용)에 따라 당황 스럽습니다. api/invoices에 접근 Invoice 기관에 대한 inteface을을 고려해컬렉션, 항목, 동사 및 REST 인터페이스 디자인 : POST가 반환해야하는 항목은 무엇입니까?

  • GET /api/invoices 송장의 목록을 반환
  • GET /api/invoices/123 반환 ID 123
  • POST /api/invoices와 송장 (서버에서 생성 ID) 새로운 송장을 추가
  • POST /api/invoices/123 ID가있는 인보이스 123
  • DELETE /api/invoices/123는 ID가 123 인 송장을 삭제합니다.

첫 번째 두 메소드가 반환해야하는 것은 꽤 분명하지만 삽입/업데이트/삭제 방법은 어떻습니까? 분명한 대답은 add은 새로 생성 된 항목 (즉, GET/api/invoices/id와 정확히 같은 응답)을 반환해야하고, update은 업데이트 된 항목 (다시 GET과 동일)을 반환해야하고 delete은 아마도 아무 것도 반환하지 않아야합니다. 빈 내용). 이것은 모두 의미 있고 합리적입니다.

그러나 Invoice 엔터티만큼 간단하지 않은 항목을 고려할 때 문제가 발생합니다. 예를 들어 add 요청은 항목을 추가 할뿐만 아니라 실제로 추가 작업에 대한 추가 정보를 반환해야합니다. 항목이 수락 (성공), 항목이 중복 (정보가 성공)이고 항목이 무시되었습니다 (예 : 정보로 성공, 나는 세부 사항으로 eneter하지 않을 것이다), 품목은 거절되었다 (실패). 또한 내 경우에는 새로 추가 된 항목에 버킷에 대해 사전 설정된 '응답'정보가 반환되는 것처럼 반환하려는 추가 정보가 있습니다. HTTP 머리글에 모든 여분의 정보를 out-of-band 정보 (200 범위와 심지어 사용자 정의 헤더의 추가 상태 코드와 같은)로 배치하는 것을 고려했지만 해킹이며 '응답'부분은 실제보다 더 클 수 있습니다. 항목 자체. 이제 add 동사가 완전히 새로운 유형의 항목 (상태, 응답, 새 항목의 ID, 전체 새 항목의 perhpas)을 포함하는 항목을 반환하는 것으로 생각합니다. 그것은 확실히 일을 끝내지 만, 나는 전에 가지고 있던 멋진 대칭을 놓친다.

좋은 연습 ('foo'유형의 항목을 추가 할 때 'bar'유형) 또는 6 개월 후에 되돌아보고 고양이를 꺼내기 때문에 내 머리를 당길 수 있습니다. 가방에요? 만약 'foo에 대한 모든 액세스가 foo를 포함하여 add를 포함하여'반환한다면, 클라이언트는 'add'연산 후에 추가 호출을 만들어서 정말로 관심있는 정보 (즉, '응답')를 검색해야합니다.

답변

1

귀하의 회신은 다소 복잡해야합니다. 인바운드 요청과 일치해서는 안됩니다. 우리는 JSON을 사용하며 객체에 추가로 몇 가지 추가 정보가 있습니다.

일반적인 Reponse :

[{ "ID": the generated ID, "TYPE": the actual class name, "OBJECT": { the object } }] 

POST는 생성 된 객체를 반환해야합니다. 추가 정보가있는 경우 (좋은 생각은 아닙니다) 응답 메시지에 해당 정보를 넣을 수 있습니다.

PUT은 업데이트 결과를 반환해야합니다.

GET처럼 DELETE는 상태를 반환 할 수 있습니다.

상태의 추가 정보는 해킹이 아닙니다. 이것이 바로 상태 코드가 개방 된 이유입니다.

항목이 받아 들여졌다
  • (성공) - 상태는 200 OK

  • 항목이 중복 (정보와 성공)입니다 - 당신이 이상하고 이상 할 것이다 가능한 어떤 정보를 모르겠어요 최종 개체가 생성되었지만 20x의 OK 위치 - OK WITH INFO 상태입니다.

  • 항목이 무시되었습니다. (정보가 성공하면 세부 정보가 표시되지 않습니다.) 이는 모호합니다. 나는 그것을 성공이라고 부르지 않을 것이다, 나는 40x라고 불렀다. - 무시했다. 당신은 당신이 왜 세부 사항에 들어갈 수 없다면 20 배로 무시할 수 있습니다.

  • 항목이 거부되었습니다 (실패). 이것은 보통 오래된 40X REJECTED 메시지입니다.

+0

'해킹'에 대한 내 의견은 맞춤 HTTP 헤더를 추가하는 것에 관한 것입니다. HTTP 상태의 경우 나는 귀하의 의견에 완전히 동의합니다. –

0

POST 반환을 위해 고려해야 할 옵션은이 추가 정보와 새로 생성 된 객체에 대한 링크를 반환하는 것입니다. 이것은 GET이 완전히 별개의 엔티티를 리턴하고 반환하는 것과 동일한 것을 리턴하는 사이에 좋은 중간 선을 실행합니다.

관련 문제