REST URI에서 조치 (동사) 표시


16

고객 문서를 인쇄 할 작업이 있습니다. add, update, delete와 같은 다른 표준 작업도 수행해야합니다. 그래서, 나는 다음을 가지고있다 :

  • 새 고객 작성 :
    URI = / customer / {id}, type = POST, Methodname = CreateCustomer ()
  • 업데이트 :
    URI : / customer / {id}, type = PUT, method = UpdateCstomer ()
  • 고객 삭제 :
    URI = / customer / {id}에 유형 = DELETE, 메소드 이름 = DeleteCustomer ()를 입력하십시오.
  • 보기 :
    URI : / customer / {id}, 유형 = GET, 메소드 = GetCustomer ()

이제 해당 고객의 문서를 인쇄해야하는 경우 인쇄 기능이 필요합니다. 내 URI는 다음과 같습니다. / customer / {id}, type = POST, method = PrintCustomer (). 그러나 CreateCustomer에 해당 URI 및 POST 유형을 사용했습니다. URI가 / customer / Print / {id}, type = POST, method = PrintCustomer ()와 같이 표시되기를 원했습니다.

그러나 URI에 "Print"동사를 사용할 수 없습니다. 가장 좋은 방법은 무엇입니까? URI로 / customer / document / {id}를 생각했지만 같은 문제가 발생합니다. "문서"에 대한 CRUD 작업이 있습니다. 다시, 나는 "인쇄"에 사용했던 것을 다 썼다. 조언 부탁드립니다.


2
인쇄는 일반적으로 클라이언트 측 작업이므로 궁금합니다. REST 서버에 명령을 보내야하는 설정은 어떻습니까?
— Shauna

2
@Shauna 반드시, URI는 서버에게 인쇄하기 쉬운 버전의 리소스 (즉, 다른 뷰)를 요청하는 것일 수 있습니다.
— Evan Plaice

1
@EvanPlaice-충분히 공정하지만 여전히 클라이언트에 인쇄 하는 행위 를 남깁니다 (서버 측 인쇄용 버전을 가져온 후에도 인쇄 할 장치를 결정하고 인쇄 명령 자체를 보내는 경우) 명령은 프린트 서버로 이동합니다). 인쇄 가능한 버전의 리소스를 가져 오라는 요청은 논리적으로 ... 잘 ... GET입니다.
— Shauna

@Shauna 브라우저 보안으로 인해 HTTP 요청만으로 인쇄 작업을 트리거 할 수 없습니다. 인쇄용 버전에 대한 요청은 단지 GET 요청이지만 브라우저가 인쇄 가능한 버전을 렌더링하도록 지정하는 방법이 필요합니다. 다른 URL을 지정할 수는 있지만 실제로는 다른 리소스를 요청하지 않고 동일한 리소스의 다른 변환 만 수행하기 때문에 REST 원칙을 위반합니다. 따라서 쿼리 매개 변수 및 / 또는 컨텐츠 유형을 통해 변환을 지정하는 이유가 있습니다.
— Evan Plaice

답변으로 게시 할 담당자가 충분하지 않지만 tyk.io/rest-never-crudPOST /customers/123/print 가 유효한 일 이라고 주장하는 것이 흥미 롭습니다 .
— jlh

답변:


9

POST"생성"을 의미하는 것이 아니라 "프로세스"를 의미합니다. 기존 리소스에 적합한 요청을 게시하여 새 리소스를 만들 수 있습니다 (예 : /customers새 고객을 만들기 위해 게시 ). 그러나 POST깔끔한 CRUD 패러다임에 해당하지 않는 다른 모든 작업을 채우는 데 사용할 수도 있습니다 .

인쇄의 경우 리소스 자체로 인쇄하는 행위를 고려해야합니다. 시스템에 "인쇄 작업"을 작성하도록 요청하고 있습니다. 즉 prints/, 요청 된 모든 인쇄물의 컨테이너 역할을 하는 리소스를 가질 수 있습니다 . 인쇄하려는 POST리소스에 대한 모든 정보가 포함 된 문서를이 리소스에 인쇄하려는 경우 해당 리소스에 대한 링크로 인쇄하려는 리소스를 식별합니다.

JSON 문서는 다음과 같습니다.

{
   contents: ["http://site/customers/12345"],
   paper-size: "A4",
   duplex: "true"
}

분명히, 원하는 작업과 관련이 있도록이를 사용자 정의해야합니다. 중요한 것은 URL을 지정하여 인쇄 할 다른 리소스를 식별한다는 것입니다.

요청에 대한 응답으로 간단히 a 200 OK또는 a 를 반환하고 204 No-Content이를 잊어 버리는 과정으로 취급 할 수 있습니다. 그러나 향상 시키 201 Created려면 새로 만든 인쇄 작업의 URL을 반환 하여 지정할 수 있습니다 (예 :) /prints/12345.

그런 다음 사용자 GET는 자원에 대해 수행하여 인쇄 작업 상태 (보류 중, 진행 중 등)를 보거나을 발행하여 작업 취소를 요청할 수 있습니다 DELETE.

리소스 측면에서 문제를 다시 말하면 RESTful 디자인은 자연스럽게 나오고 즉시 고려하지 않은 방식으로 확장하고 향상시킬 수있는 기회를 제공해야합니다.


2
POST는 일반적으로 작성 / 삽입을 의미하고 put은 일반적으로 갱신 저장 / 업데이트를 의미합니다. 그것이 HTML에서 일반적으로 사용되는 방식이 아니더라도 REST에서 정의되는 방식입니다.
— Evan Plaice

2
@EvanPlaice HTTP 스펙은 PUT을 작성 / 업데이트 동사 (보다 친숙한 작성 + 검색 + 업데이트 대신 작성 + 업데이트 모델 사용)로 이름 지정하고 POST는 "데이터 처리"동사 및 "추가"동사입니다. . 그의 블로그에서 Roy Fielding은 POST를 당신이 작업을 표준화하고 싶지 않을 때 사용할 동사로 묘사했습니다. POST는 항목 모음에 새 항목을 추가 할 때 "만들기"의미를 취합니다. 이 경우 Tragedian은 POST를 사용하여 인쇄 작업을 처리하거나 추가하기 위해 머리에 못을 박았습니다.
— Rob

@RobY 알았어. 예를 들어, PUT을 사용하여 데이터베이스에 데이터를 입력하도록 설계된 SPROC를 나타낼 수 있습니다. 반면, POST는 해당 데이터를 수집 / 준비하는 데 필요한 중간 단계와 돌연변이를 구성 할 수 있습니다. POST 작업의 디자인은 디자인이 발전함에 따라 변경되거나 교체 될 수 있지만 PUT 작업은 (이상적으로) 변경해서는 안되는 모델을 나타냅니다. 내 답변을 업데이트했지만이 답변은 이미 차이점을 설명하는 데 큰 도움이됩니다.
— Evan Plaice

4

나는 전에 이것을했다. 문서를 인쇄하기 위해 pdf 버전의 리소스 만 반환합니다. 클라이언트는 Accept 헤더 application / pdf와 함께 리소스에 대한 GET 요청 만 보내면됩니다.

또한 인쇄 작업과 같은 임시 리소스에 대한 새 URI를 만들지 않아도됩니다. HTTP 헤더를 사용하는 것도 REST의 일부이며 URI를 깨끗하게 유지합니다.


3

현재 URI의 GET에 매개 변수를 추가하기 만하면됩니다.

여러 작업에 URI를 사용하는 것이 일반적입니다.

동일한 리소스이지만 다른 작업에 대해 이야기하는 경우이를 매개 변수로 정의합니다.

/ customer / {id}? print = true

그런 다음 GET 메소드를 정의 할 때 인쇄 매개 변수의 존재를 감지하고 다르게 처리합니다.

REST는 다음과 같은 방식으로 정의됩니다.

  • POST-레코드, 자산 또는 리소스 생성
  • PUT-업데이트, 레코드, 자산 또는 리소스
  • 삭제-레코드, 자산 또는 자원 제거

반면에 GET은 일반적으로 리소스를 검색 할 수있는 다양한 형식이 많기 때문에 여러 가지 방법으로 사용됩니다. 이것이 GET 요청이 쿼리 문자열로 표시되는 이유이기도합니다. 데이터베이스 리소스로 작업하는 경우 말 그대로 쿼리를 통해 뷰를 검색하지만 REST는 여러 유형의 리소스를 처리하도록 설계 되었기 때문에 의도적으로 더 높은 수준으로 추상화됩니다.

REST 사양은 API가 최근에 많이 사용하기 시작했지만 상당히 앞선 생각입니다.

REST 프로토콜에 대한 자세한 내용은 " Haters Gonna Hate HATEOAS "를 참조하십시오.


최신 정보:

@Shauna는 내 추론에 흥미로운 구멍을 지적했습니다. 아무 없다 진정한 권리의 방법은 많은 형태를 사용할 수있는 것으로 간주합니다. 나는 그것에 대해 조금 더 생각했고 데이터를 다른 표현으로 변환하는 것이 목적이므로 변환을 새로운 MIME 유형으로 정의하는 것이 좋습니다.

예를 들어 URI를 다음과 같이 나타낼 수 있습니다.

/customer/{id}+print

응답 Content-Type을 text / html + print로 설정할 수있는 위치. 그러면 향후 더 많은 변환을 정의 할 수도 있습니다.

예를 들면 다음과 같습니다.

// for application/json
/customer/{id}+json

// for application/atom+xml
/customer/{id}+atom

어느 쪽이든, 모든 형태가 허용됩니다. 결정하는 구현은 개인 취향 및 서버 기능에 따라 다릅니다.

제쳐두고 : 혼란 스러울 것 같아서 명확히하겠습니다. 'print'query-parameter 및 / 또는 content-type은 리소스 변환 방법을 지정하는 데 사용됩니다. 실제 인쇄 작업을 트리거하는 방법이 아닙니다. 보안상의 이유로 하드웨어 수준 액세스는 항상 사용자 / 클라이언트 / 브라우저에게 맡겨집니다.


추가-쿼리 문자열 ( ?print=true) 을 사용하는 대신 URI 매개 변수 (예 :-)를 사용할 수도 있습니다 /customer/{id}/printable. 사용하는 시스템은 일반적으로 시스템 (CMS, 프레임 워크, 코드)이 처리하도록 설정 한 표준에 따라 다릅니다. 둘 다 유효하고 수용 가능한 것으로 간주됩니다 .
— Shauna

@Shauna 기술적으로 가장 좋은 방법은 URI '/ customer / {id} + print'및 응답 MIME-Type of text / html + print로 인쇄하는 데 고유 한 MIME 유형을 사용하는 것입니다. 이러한 접근 방식의 장점은 동일한 URI에 대해 많은 MIME 유형 (예 : text / html, text / x-markdown, application / json 등)에 대한 변환을 작성할 수 있다는 것입니다. 제시 한 솔루션의 단점은 모든 MIME 유형마다 추가 URI를 만들고 다른 경로를 정의해야한다는 것입니다. REST 사용의 목적을 다소 상실합니다.
— Evan Plaice

(cont) URI-hacks는 ROR 커뮤니티에서 주로 도입 한 안티 패턴이지만 이것이 유용하지 않다고 주장합니다. 더 나은 저수준 HTTPd 서버가 등장함에 따라 REST 기능을 최대한 활용하는 방식으로 REST를 구현하기가 점점 쉬워지고 있습니다. Apache와 index.html을 통해 모든 것을 라우팅하는 것이 유일한 옵션이었던 시절부터 많은 것들이 왔습니다.
— Evan Plaice

2
GET은 상태를 변경하거나 부작용이 없어야합니다. GET은 dem 등성이 기 때문에 미들웨어가 요청을 보지 못하면 요청을 재 시도 할 수 있습니다. 이 경우 재 시도 할 때마다 새로 인쇄 된 문서 사본이 만들어집니다. ;)
— Rob

@RobY 나는 '인쇄'작업이 브라우저와 인쇄 드라이버가 더 잘 제공 할 수 있도록 문서를 실제로 인쇄하는 프로세스를 처리하지 않을 것이라고 가정했습니다. 대신, 미디어 / 인쇄 출력은 문서의 '인쇄 친화적'표현을 반환합니다. 따라서 dem 등성이 유지됩니다. 좋은 점은, 무국적 방식으로 인터넷을 통해 인쇄 작업을 보내는 것은 좋지 않은 시간입니다.
— Evan Plaice
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.