URL 구조를 어느 정도 자유롭게 변경하는 기능 외에 HATEOAS는 검색 성과 분리를 위해 무엇을 제공합니까?


61

최근에 웹 API를 "정말 RESTful"로 만드는 제약 조건 인 HATEOAS (Engine of Application State)로서 Hypermedia에 대해 읽었습니다. 기본적으로 현재 상태에서 가능한 전환에 대한 모든 응답이 포함 된 링크를 포함합니다.

내 이해를 바탕으로 HATEOAS가 무엇인지 설명해 드리겠습니다. 무언가를 놓친 경우 수정 해주세요.

/
    GET: {
        "_links": {
            "child": [
                { "href": "http://myapi.com/articles", "title": "articles" }
            ]
        }
    }

/articles?contains=HATEOAS
    GET: {
        "_items": [
            { "uri": "http://myapi.com/articles/0", "title": "Why Should I Care About HATEOAS?" },
            { "uri": "http://myapi.com/articles/1", "title": "HATEOAS: Problem or Solution?" }
        ],
        "_links": {
            "self": { "href": "http://myapi.com/articles", "title": "articles" },
            "parent": { "href": "http://myapi.com/", "title": "home" }
        }
    }

    POST: {
        "title": "A New Article",
        "body": "Article body",
        "tags": [ "tag1", "tag2" ]
    }

/articles/0
    GET: {
        "title": "Why Should I Care About HATEOAS?",
        "body": "Blah blah blah"
        "tags": [ "REST", "HATEOAS" ],
        "_links": {
            "self": { "href": "http://myapi.com/articles/0", "title": "article" },
            "parent": { "href": "http://myapi.com/articles", "title": "articles" }
        }
    }

HATEOAS는 두 가지 주요 이점을 제공한다고 주장합니다.

  1. 루트 URI부터 전체 서비스를 검색 할 수 있으며 더 이상 문서가 필요하지 않습니다.

  2. 클라이언트는 서버에서 분리되어 URI 구조를 자유롭게 변경할 수 있습니다. 따라서 API 버전 관리가 필요하지 않습니다.

그러나 내 견해로는 서비스는 URI 구조보다 훨씬 많습니다. 효과적으로 사용하려면 다음 사항도 알아야합니다.

  • 사용할 수있는 쿼리 매개 변수 및 가능한 값
  • POST / PATCH / etc 요청으로 보내야하는 JSON / XML / 문서의 구조
  • 서버가 보낸 응답의 구조
  • 발생할 수있는 오류
  • ...

위의 내용을 바탕으로 HATEOAS는 발견 및 커플 링 문제의 작은 부분 만 해결합니다. 여전히 위의 네 가지 측면을 문서화해야하며 클라이언트는 여전히 서버와 강력하게 연결됩니다. 클라이언트 중단을 피하려면 여전히 API 버전을 수정해야합니다.

그것이 제공하는 유일한 장점은 더 많거나 적은 자유롭게 (원칙에 무슨 일이 있었는지 방식에 의해 당신의 URL 구조를 변경할 수 있다는 것입니다 "변경하지 않는 쿨의 URI" ?). 이해가 정확합니까?

답변:


46

나는 당신의 본능이 크게 맞다고 생각합니다. 사소한 웹 응용 프로그램의 경우 클라이언트가 구문뿐만 아니라 수행하는 작업의 의미에 대해 신경 써야 할 것처럼 선언 된 이점은 실제로 그렇게 크지는 않습니다.

그렇다고해서 응용 프로그램이 HATEOAS의 원칙을 따르지 않아야한다는 의미는 아닙니다!

HATEOAS은 실제로 무엇을 의미합니까? 그것은 웹 사이트처럼 원칙적으로 응용 프로그램을 구성 하고 복잡한 스키마를 다운로드하지 않고도 원하는 모든 작업을 발견 할 수 있도록 구성하는 것을 의미합니다. (정교한 WSDL 스키마는 모든 것을 다룰 수 있지만, 실제로는 거의 모든 프로그래머가 이해할 수는 있지만 글을 쓰지 않아도됩니다! HATEOAS를 이러한 복잡성에 대한 반응으로 볼 수 있습니다.)

증오가 단지 풍부한 링크를 의미하는 것은 아닙니다. 이는 HTTP 표준의 오류 메커니즘사용하여 무엇이 잘못되었는지 정확하게 표시 함을 의미합니다. 당신은 단지“waaah! 아니요”대신 실제로 무엇이 잘못되었거나 클라이언트가 어떻게 할 수 있는지 설명하는 문서를 제공 할 수 있습니다. 그것은 또한 의미 지원 같은 것들 OPTIONS 요청 하고 (고객들이 사용할 수있는 어떤 HTTP 방법을 찾을 수 있도록하는 표준 방식) 콘텐츠 형식의 협상을 응답의 형식은 클라이언트가 처리 할 수있는 형태에 적용 할 수 있도록합니다. 설명 텍스트를 넣는 것을 의미 합니다클라이언트가 알 수없는 사소한 경우에 시스템을 사용하는 방법을 찾을 수 있도록 설명 텍스트는 사람이 읽을 수 있거나 기계가 읽을 수 있습니다 (원하는대로 복잡 할 수 있음). 마지막으로 클라이언트는 링크를 합성하지 않습니다 (쿼리 매개 변수 제외). 고객은 링크를 한 경우에만 링크를 사용합니다.

링크에 대한 훌륭한 메모리와 HTTP 표준에 대한 백과 사전 지식을 갖춘 사용자 (HTML 대신 JSON 또는 XML을 읽을 수 있으므로 약간 이상 함)가 사이트를 탐색하는 것에 대해 생각 해야합니다. 하다.

물론 컨텐츠 유형 협상을 사용하여 HTML (5) / JS 클라이언트를 제공하여 브라우저가 승인 할 준비가되어있는 경우 애플리케이션을 사용할 수 있습니다. 결국 RESTful API가 좋으면 그 위에 구현하는 것이 "사소한"것입니까?


6

HATEOAS에는 RESTful API가 무엇인지 정의하는 두 번째 기둥, 즉 표준화 된 미디어 유형이 있어야합니다. 로이 자신이 말했다

REST API는 리소스를 나타내는 데 사용되는 미디어 유형을 정의하는 데 거의 모든 노력을 기울여야합니다 ".

전환을 명시 적으로 정의하는 표준화 된 미디어 유형과 리소스를 서로 가리 키도록하는 하이퍼 텍스트를 사용하면 클라이언트를 중단하지 않고도 모든 형태를 취할 수있는 리소스 그래프를 만들 수 있습니다. 웹 작업과 마찬가지로 실제로 문서 사이에 링크가 있으며 문서는 해당 링크를 따르는 방법을 정의하는 HTML로 작성됩니다. <a href>GET, <form>GET 또는 POST (GET의 경우 사용할 URL 템플리트 정의), <link type="text/css">GET ... 등입니다. 브라우저가 임의의 구조화 된 HTML 페이지 및 웹을 탐색 할 수있는 방법입니다.

당신이 만든 모든 요점

  • 사용할 수있는 쿼리 매개 변수 및 가능한 값
  • POST / PATCH / etc 요청으로 보내야하는 JSON / XML / 문서의 구조
  • 서버가 보낸 응답의 구조
  • 발생할 수있는 오류

표준화 된 미디어 유형의 정의로 해결 해야 할 포인트입니다 . 물론 이것은 훨씬 더 어렵고 대부분의 사람들이 "REST"API를 정의 할 때 생각하는 것이 아닙니다. 비즈니스 엔티티를 가져 와서 속성을 JSON 문서에 밀어 넣어 RESTful API를 가질 수는 없습니다.

물론 REST는 "복잡한 SOAPy 대신 HTTP 사용"을 의미하기 위해 어떤 식 으로든 희석되었습니다. HTTP와 HyperText를 사용하는 것만으로는 충분하지 않으므로 대부분의 사람들이 잘못합니다.

이것이 꼭 필요한 것은 아닙니다. REST는 장기적인 유지 관리 성과 진화 성과 교환하여 성능을 희생하고 개발을 용이하게합니다. 그것은 큰 기업 응용 프로그램 통합을 위해 만들어졌습니다. 하드 코딩 된 JSON 구조의 작은 웹 API가 필요할 수 있습니다. 단지 임시 웹 API 인 REST라고 부르지 마십시오. 그리고 그것은 그것이 빨라다는 것을 의미하는 것이 아니며, 단지 REST의 제약을 따르려고 시도하지 않는다는 것을 의미합니다.

추가 자료

희망이 조금 명확 해지기를 바랍니다. :)


2

어떤 종류의 요청을 보내야하는지에 대한 자세한 정보를 포함하여보다 풍부한 응답을 제공하기 위해 노력하는 일부 하이퍼 미디어 형식이 있으며, 더 많은 정보로 응답을 풍부하게하는 데 방해가되지 않습니다.

사이렌 문서 의 예는 다음과 같습니다 .

{
  "class": [ "order" ],
  "properties": { 
      "orderNumber": 42, 
      "itemCount": 3,
      "status": "pending"
  },
  "entities": [
    {
      "class": [ "info", "customer" ],
      "rel": [ "http://x.io/rels/customer" ], 
      "properties": { 
        "customerId": "pj123",
        "name": "Peter Joseph"
      },
      "links": [
        { "rel": [ "self" ], "href": "http://api.x.io/customers/pj123" }
      ]
    }
  ],
  "actions": [
    {
      "name": "add-item",
      "title": "Add Item",
      "method": "POST",
      "href": "http://api.x.io/orders/42/items",
      "type": "application/x-www-form-urlencoded",
      "fields": [
        { "name": "orderNumber", "type": "hidden", "value": "42" },
        { "name": "productCode", "type": "text" },
        { "name": "quantity", "type": "number" }
      ]
    }
  ],
  "links": [
    { "rel": [ "self" ], "href": "http://api.x.io/orders/42" },
    { "rel": [ "previous" ], "href": "http://api.x.io/orders/41" },
    { "rel": [ "next" ], "href": "http://api.x.io/orders/43" }
  ]
}

보시다시피, 관련 통화 방법에 대한 정보 actions가 메시지에 제공되며이 정보를 해석하면 클라이언트가 변경에 대한 저항력이 높아집니다.

rel고정 어휘가 아닌 조회 가능한 URI 인 경우 특히 강력합니다 .


0

HATEAOS 서비스에 대한 "문서가 더 이상 필요하지 않음"을 어디에서 읽었습니까? 당신이 말했듯이, 당신은 여전히 ​​링크의 의미를 문서화해야합니다. 그러나 HATEOAS를 사용하면 대부분의 URI 구조를 문서화 할 필요가 없으므로 영원히 유지할 수 있습니다.

HATEOAS를 사용하면 서비스 구현자가 클라이언트가 의존하는 작은 URI 세트를 변경하지 않고도 구현을 상당히 효율적으로 수정 및 확장 할 수 있습니다. 적은 수의 진입 점을 큰 세트보다 변경하지 않는 것이 더 쉽습니다. 따라서 서비스에 대한 공개 진입 점 수를 줄이고 하위 리소스 (HATEOAS)에 대한 링크를 동적으로 제공하면 실제로 비 HATEOAS 서비스보다 "쿨 URI가 변경되지 않음"을 더 잘 지원합니다.


"문서가 더 이상 필요하지 않다"는 것을 읽을 수있는 한 곳은 Roy Fielding의 논문으로,이 용어를 만들어 냈습니다.
meriton-파업

1
방금 Fielding의 논문 에서 "문서"사용에 대해 검색 했으며 "문서가 더 이상 필요하지 않습니다"라는 문구와 유사한 것을 발견했습니다. Fielding의 논문에서이 주장을 어디서 발견했는지 알려주시겠습니까?
Jonathan Giddy

0

(HATEOAS), 웹 API를 "정말 RESTful"로 만들기 위해 요구되는 제약

진정한 REST API로 만드는 유일한 것은 단일 제약 조건이 아닌 모든 제약 조건을 충족시키는 것입니다.

그러나 내 견해로는 서비스는 URI 구조보다 훨씬 많습니다. 그것을 효과적으로 사용하려면 다음을 알아야합니다. ...

그렇기 때문에 다른 제약, 자기 설명 메시지 등이 필요합니다.

클라이언트 중단을 피하려면 여전히 API 버전을 수정해야합니다.

아무리 노력해도 API를 버전 화해야합니다. REST 클라이언트에서는 메시지를 설명하는 RDF vocab을 기반으로 수행 할 작업, 수행 할 링크 및 수집해야하는 특성에 대해 페이지로 이동하는 방법을 알아야합니다. 해당 vocab에서 무언가를 바꾸거나 제거해야하는 경우 모든 클라이언트가 손상 될 수 있으며 새 버전이 필요합니다. 따라서 REST는 일찍 게시 해야하는 것이 아니며 API를 지속적으로 변경하는 동안 모델을 파악해야합니다. 그렇지 않으면 많은 버전이 있습니다. 먼저 구축 할 수있는 안정적인 도메인 모델이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.