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

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

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

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

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

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



답변

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

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

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

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


답변

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

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

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

다른 것은 불필요합니다.


답변

두 가지 다른 질문 :

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

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

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

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


답변

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

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

또는:

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

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


답변

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>


답변