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.