REST에서 POST 후 콘텐츠를 반환해도 괜찮습니까?


88

RESTlet을 사용하고 있으며 리소스를 만들었습니다. acceptRepresentation메서드 를 재정 의하여 POST를 처리합니다 .

클라이언트는 나에게 데이터를 보내고 DB에 저장하고 응답을 201 (SUCCESS_CREATED)로 설정하고 일부 데이터를 클라이언트에 반환해야하지만 반환 유형 acceptRepresentationvoid.

제 경우에는 클라이언트가 해당 리소스에 액세스 할 수 있도록 식별자를 반환해야합니다.

예를 들어 URL이있는 리소스가 /resource있고 클라이언트가 POST 요청을 보내는 경우 DB에 새 행을 추가하고 주소는 /resource/{id}. 을 보내야 {id}합니다.

내가 뭘 잘못하고 있니? REST 원칙은 POST 후 무언가를 반환하도록 허용합니까? 그렇다면 어떻게해야하며, 그렇지 않은 경우이 상황을 처리하는 방법은 무엇입니까?


acceptRepresentation () 내에서 응답 본문을 설정하는 방법은 Thom의 답변을 참조하십시오.
Avi Flax

답변:


96

REST는 균일 한 인터페이스를 준수해야한다고 말합니다. 즉, HTTP 사양에 따라 POST가 수행해야하는 작업을 수행해야한다고 말합니다 . 다음은 관련 사양의 인용문입니다.

자원이 원 서버에 생성 된 경우 응답은 201 (생성됨)이어야하며 요청 상태를 설명하고 새 자원을 참조하는 엔티티와 위치 헤더 (14.30 절 참조)를 포함해야합니다.

여기에서 볼 수 있듯이 새로 생성 된 리소스가 상주하는 클라이언트에 표시 할 수있는 두 곳이 있습니다. Location 헤더에는 새 리소스를 가리키는 URL이 있어야하며 세부 정보와 함께 항목을 반환 할 수도 있습니다.

acceptRepresentation () 재정의와 post () 재정의의 차이점이 무엇인지 잘 모르겠지만 예제는 POST에서 응답을 반환하는 방법을 보여줍니다.


2
@ del-boy : acceptRepresentation () 내에서 응답 본문을 설정하는 방법은 Thom의 답변을 참조하십시오.
Avi Flax

1
HTTP 사양 인용문은 응답을 금지하지 않습니다. 섹션 6을 살펴보면 다음과 같이 분명합니다. 허용됩니다. Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
MikeF

@MikeF 응답 본문이 허용되지 않는다고 추론하려는 의도가 아닙니다. 내가 인용 한 사양의 일부는 "그리고 엔터티를 포함한다"라고 구체적으로 말합니다. 나는 내 텍스트에서 더 명확해야했다.
Darrel Miller

16

나는 응답 본문에 아무것도 보내지 않았습니다. Location :을 새로 생성 된 리소스의 (전체) URL로 설정하기 만하면됩니다.

귀하의 설명은 이것이 정확히 귀하의 의미임을 암시합니다.

  1. 그것을 만들기 위해 물건을 게시
  2. 다음 두 가지를 충분히 알고 응답하십시오.
    1. 창조가 일어났다 (201 년)
    2. 새로운 것을 찾을 수있는 곳 (위치 헤더)

다른 것은 불필요합니다.


위키 백과는 항상 좋은 소스,하지만하지 않는 것이 또한 주장 "[...] 새로 생성 된 자원의 위치에 대한 정보를 제공합니다.이 상황에서, 위치 헤더 (201) 또는 (202)의 HTTP 상태 코드와 함께 전송한다 . "
Arjan

1
POST는 하나 이상의 리소스를 생성하는 로직을 실행할 수 있습니다. 처리 결과는 클라이언트에 의해 필요할 수 있습니다. 따라서 응답으로 반환하면 API에 대해 하나 이상의 GET 호출을 수행 할 필요가 없습니다. POST 메서드에 의해 생성 / 변경된 데이터는 클라이언트에 불필요하지 않을 수 있습니다 (종종 그렇지 않습니다).
Paulo Merson

10

두 가지 다른 질문 :

REST 애플리케이션 패턴이 POST에서 데이터 반환을 지원합니까?

REST가 명시 적으로 허용하지 않는다고 생각하지 않지만 선호하는 치료법은 Darrel의 답변에 나와 있습니다.

RESTlet 프레임 워크는 POST에서 데이터 반환을 허용합니까?

예, void를 반환하더라도 Resource를 확장하는 클래스에서는 getResponse () 메서드를 통해 Response 객체 객체에 대한 전체 액세스 권한이 있습니다. 따라서 원하는 데이터로 getResponse (). setEntity ()를 호출 할 수 있습니다.


6

요청 된 형식으로 출력하십시오. 다음과 같을 수 있습니다.

<success>
    <id>5483</id>
</success>

또는:

{ "type": "success", "id": 5483 }

보통하는 일에 따라 다릅니다. 데이터를 기대하지 않는 경우에는 무시해야하지만 제대로 처리하려는 클라이언트는 할 수 있어야합니다.


좋아, 두 가지 가능한 형식 (html 및 xml)이 있습니다. 요청 된 형식의 유형을 처리하는 방법을 알고 있지만 응답에 데이터를 추가하는 방법을 모릅니다. represent 메서드는 Representation을 반환하므로 원하는 것을 반환하지만 acceptRepresentation은 void 메서드이므로 데이터를 반환 할 수 없습니다.
del-boy

1

201 Created with an entity body라고 응답하는 경우 응답에 표시되는 리소스를 가리키는 Content-Location 헤더를 포함하는 것이 좋습니다.

이것은 잠재적 인 혼동을 피할 것입니다. 클라이언트는 응답 엔터티가 실제로 생성 된 리소스가 아닌 '생성자'의 새로운 상태를 나타낸다고 (정당하게) 가정 할 수 있습니다.

> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>

3
Content-Location은 다른 목적을위한 것 같습니다. HTTP 사양에는 POST 및 PUT에 대해 Content-Location이 정의되지 않았습니다. Location 헤더는 201-Create와 함께 사용됩니다. 위치 반환은 자동으로 리디렉션되지 않으므로 3XX 응답 코드가 필요합니다.
Darrel Miller

1
위치 헤더는 (201 응답에서) 생성 된 리소스의 위치를 ​​나타 내기 위해 사용됩니다. 수반되는 응답의 엔터티 본문과 관련이 없습니다. 내 요점은-생성 된 리소스를 201 응답 자체에 포함하려면 (클라이언트를 다른 URI로 리디렉션 / 리디렉션하는 대신) 콘텐츠 위치 헤더가 좋은 생각입니다. 이것은 아마도 '규칙을 구부리는 것'일 수 있지만 클라이언트에 새 리소스의 상태를 가져 오기 위해 다른 요청 / 응답주기를 요구하는 것보다 더 효율적입니다.
Mike

나에게 이해가 되십시오. 이전에 Content-Location 헤더를 사용한 적이 없습니다.
Darrel Miller

클라이언트가 브라우저가있는 사람이라면 Location 헤더와 함께 201을 반환하는 것은 의미가 없습니다. 사용자는 그것으로 무엇을 해야할지 모릅니다. 클라이언트가 로봇 인 경우 해당 위치에 대한 후속 GET과 같이 처리 방법을 알고 프로그래밍 할 수 있습니다.
평판이 좋지 않은 2009

3
@irreputable : REST는 API 설계를위한 것이라고 생각합니다. A는 렌더링 할 HTML을 찾는 사용자 에이전트를 의미하지 않습니다.
Hermes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.