2014-03-24 2 views
0

Symfony2를 사용하여 REST API를 개발 중입니다. 예약 시스템을 보유하고 있으며 관리자가 예약을 확인하면 고객에게 이메일을 보내고 싶습니다.HTTP 패치 방법. 요청 본문의 내용

내가 예약 ressource을 가지고, 우리는이 URL을 사용하여 예약을 확인 할 수 있습니다

PATCH 로컬 호스트/: ID를/나는 그것이를 정정에 이메일 내용을 넣어 있는지 알고 싶어

을 확인 PATCH 메소드를 사용하여 ressource를 확인할 때 본문을 요청하십시오.

아니요, 올바른 방법은 무엇입니까?

감사합니다. Mehdi.

+0

요전에 나는 API 문서를 쓸데없이 사용하고 있었고 처음으로 PATCH 요청에 반대하여 이전에 이런 유형의 요청을 알지 못했습니다. 그런 다음 필자는이 파일을 검색하여 http://pic.dhe.ibm.com/infocenter/tivihelp/v58r1/index.jsp?topic=%2Fcom.ibm.mif.doc%2Fgp_intfrmwk%2Foslc%2Fc_oslc_patch_method.html을 발견했습니다. 더 많이 설명해 주시면 감사하겠습니다. 감사합니다 –

답변

4

먼저 리소스 및 나머지에 대해.

PATCH localhost/:id/validate라고 말하면 "기존 유효성 검사를 업데이트하고 있습니다"라고 읽어야합니다. "확인"은 아무런 의미가 없으며 적절한 영어가 아닙니다. 유효성 검사는 리소스가 아니라 동작입니다. URL에 액션 (동사)이 있으면 API는 REST가 아닌 RPC입니다. 또한 my longer answer here을 참조하십시오.

당신이 무엇을 생각하는지 정말로하고 있습니다. 다음 중 하나 : 당신은 예약

  • 당신은 예약
  • 당신은 그 예약의 검증 된 버전으로 예약 교체에 유효성 검사를 만드는을 업데이트

    • .

    첫 번째 것이 가장 이해하기 쉽고 간단합니다.
    PATCH /reservations/{id} status=valid
    예약에 이미 이메일 주소가 있습니까? 그런 다음 사용하십시오. 그렇지 않으면 이메일을 함께 보내는 것을 고려하십시오.
    PATCH /reservations/{id} status=valid&[email protected].
    "예약 전자 메일 및 상태를 다음 값으로 업데이트"로 읽습니다. 패치 (및 POST)에 부작용이있을 수 있으므로 메일을 보내는 것은 문제가 없습니다.

    하나의 예약에서 많은 유효성 검사가 필요한 경우 두 번째가 필요합니다. 또는 REST- 고객이 예약과 별도로 인증을 추적해야하는 경우 (예 : GET /reservations/{id}/validations/{id}). 이 경우 Validation 리소스가있는 것이 좋습니다.
    POST /reservations/{id}/validations.
    예약에 이메일 주소가 없다면 함께 보내주십시오.
    POST /reservations/{id}/validations [email protected].
    "전자 메일 [email protected]에서이 예약에 대한 유효성 확인"이라고 읽습니다. "이 예약에서 새 확인을합니다"라고 읽습니다. POST (및 PATCH)에는 부작용이있을 수 있으므로 메일을 보내는 것은 완벽합니다.

    세 번째 사례는 부작용 때문에 중요합니다. 고객이 부작용이 없다는 것을 확신 할 수있는 방법을 제시하고자하는 경우, 이는 효과가 있습니다.
    PUT /reservations/{id} room=12&date=1970-01-01&status=valid&[email protected]
    "유효 상태가 유효한 유효성 검사로 기존 예약을 바꿉니다." PUT에는 부작용이 없어야하므로 클라이언트는 결코 네트워크 오류, 과부하 등으로 인해 사용자가 스팸 메일을 보내지 않을 것이라고 확신 할 수 있습니다.

  • +0

    완벽한 답변. 감사 –

    1

    목표가 유효성을 검사하는 것이라면 POST이 더 적절할까요? 유효성 검사의 개념은 리소스와 비슷한 것보다 RPC와 유사합니다. RFC 5789에 따르면 리소스를 부분적으로 수정하는 데 PATCH을 사용해야합니다.

    +0

    유효성을 검사 할 때, resource는 "unvalidate"상태에서 "validate"상태로갑니다. 그래서 나는 ressource가 부분적으로 수정되었다고 생각했다. 내가 할 때 나는 어떤 새로운 ressource를 만들지 않았다. 그래서 왜 post 메소드를 사용 하는가? –

    +0

    'POST '는 일반적으로 RPC 스타일의 웹 서비스와 함께 사용됩니다. 리소스를 수정할 수도 있지만 URL은 RPC처럼 보입니다. 이것이 제가 POST를 제안한 유일한 이유입니다. 아마 당신은 자원 URL 자체에'PATCH'를 사용하고 단순히'/ validate'를 생략해야합니다. 그런 다음 내용 본문에있는 메시지를 사용하여 리소스를 패치하는 방법 *을 결정합니다. – NathanAldenSr

    +0

    @MehdiChamouma "왜 ressource가 부분적으로 수정되었다고 생각했는지"는 적절한 추론입니다. POST가 적절하지 않고 올바른 패치가 올바른지 확인하십시오. – berkes