REST API에서 ID 대신 URL을 사용하는 것이 정말 실용적입니까?

lex82

REST API의 적절한 디자인은 논란의 여지가있는 주제 인 것 같습니다. 내가 이해하는 한, ID에 대한 순수한 접근 방식은 URL이 외부 세계에 대한 유일한 리소스 식별자이므로 클라이언트가 어떤 식 으로든 URL을 해석 할 필요가 없다는 것입니다 (예 : 최신 segment는 id 임) 간단한 GET 요청에 대해 반환 된 표현에 id를 명시 적으로 포함 할 필요도 없습니다.

클라이언트가 ID를 기반으로 URL을 생성하는 데 신경을 쓸 필요가 없기 때문에 언뜻보기에 이것은 좋은 규칙 인 것 같습니다. ID는 리소스를 검색하는 방법을 알려줍니다. 그러나 이것이 실제로 실제로 적용 가능한지 의심 스럽습니다. 내 마음에 떠오르는 몇 가지 우려 :

  • 새 API 버전으로 인해 URL이 변경되는 경우 (URL의 일부인 경우)
  • 또는 프로토콜이 http에서 https로 변경됩니다.
  • 또는 응용 프로그램이 어떤 이유로 든 다른 도메인으로 이동합니다.
  • 짧은 ID는 매개 변수에서 리소스를 참조하는 데 편리합니다. 이것은 불가능합니다./books?author=short.author.id

소비자가 ide를 그렇게 해석해서는 안되기 때문에 실제로 거기에 속하지 않는 id에 너무 많은 정보를 넣습니다.

이것은 실제로 실제로 수행됩니까? 이 패턴을 적용하는 인기있는 공용 API의 예가 있습니까? 아니면 내가 그것을 올바르게 이해하지 못하고 이것이 REST 순수 주의자들이 옹호하는 것이 아닐 수도 있습니다.

알렉산드 루 마르 쿨 레스 쿠

Hypermedia Driven RESTFul API를 살펴보십시오. HATEOAS에서 URI는 검색 가능하며 문서화되지 않으므로 변경할 수 있습니다. 즉, 시스템의 진입 점이 아닌 경우 ( Cool URIs , 클라이언트가 하드 코딩 할 수있는 유일한 항목)-나머지 부분을 발전시킬 수있는 기능을 원한다면 너무 많으면 안됩니다. 향후 시스템의 URI 구조. 이것은 실제로 REST 의 가장 유용한 기능 중 하나입니다 .

나머지 비 Cool URI의 경우 시간이 지남에 따라 변경 될 수 있으며 API 문서에는 하이퍼 미디어 순회를 통해 런타임시 발견되어야한다는 사실이 명시되어 있어야합니다.

Richardson의 성숙도 모델 ( 레벨 3 )을 살펴보면 링크가 작동하게됩니다. 예를 들어 최상위 수준에서 / api / version (/ 1)이라고하면 그룹에 대한 링크가 있음을 알 수 있습니다. HAL Browser 와 같은 도구에서 이것이 어떻게 보이는지 다음과 같습니다 .

뿌리:

{
  "_links": {
    "self": {
      "href": "/api/root"
    },
    "api:group-add": {
      "href": "http://apiname:port/api/group"
    },
    "api:group-search": {
      "href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
    },
    "api:group-by-id": {
      "href": "http://apiname:port/api/group/{id}" (OR "href": "http://apiname:port/api/group?id={id}")
    }
  }
}

여기서 장점은 클라이언트가 관계 (링크) 이름 (리소스 구조 / 속성 외에 분명히 알 수 있음) 만 알면되는 반면, 서버는 관계 (및 리소스) URL을 대부분 자유롭게 변경할 수 있다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 특정 상황에서 subscribe () 대신 async-pipe를 사용하는 것이 정말 낫습니까?

분류에서Dev

우리는 JMS를 사용하는 대신에 정보를 교환하기위한 REST 템플릿을 사용하여 얻는 이점은 무엇입니까?

분류에서Dev

최신 Linux에서 noatime을 사용하는 것이 합리적입니까?

분류에서Dev

세션에서 사용자 ID 또는 사용자 이름을 설정하는 것이 안전합니까?

분류에서Dev

jQuery 플러그인에서 $ (this) 대신 이것을 사용하는 이유는 무엇입니까?

분류에서Dev

jQuery 플러그인에서 $ (this) 대신 이것을 사용하는 이유는 무엇입니까?

분류에서Dev

정의에서 "xor"대신 "or"를 사용하는 이유는 무엇입니까?

분류에서Dev

정적 할당 대신 고정 길이 할당을 사용하는 이유는 무엇입니까?

분류에서Dev

Firefox 7에서 최대 800MB의 RAM을 사용하는 것이 정상입니까?

분류에서Dev

Vaadin에서 VerticalLayout 대신 FormLayout을 사용하는 이유는 무엇입니까?

분류에서Dev

"/ etc / hosts"가있는 웹 사이트를 차단하거나 허용하는 것은 정말로 더 이상 사용되지 않습니까? 대신 무엇을 사용해야합니까?

분류에서Dev

scikit-learn DecisionTreeRegressor에서 "X"대신 실제 기능 이름을 사용하는 방법은 무엇입니까?

분류에서Dev

API Rest에 대한 URL을 사용하는 날짜 필터-Codeigniter

분류에서Dev

"Rick and Morty"REST API를 사용하여 내 화면에 이름을 렌더링하려고하는데 말 그대로 렌더링되는 것이없고 상태가 업데이트되지 않습니다.

분류에서Dev

하나 대신 여러 쿼리를 사용하는 것이 "정상"입니까?

분류에서Dev

Ruby에서 클래스 대신 모듈을 사용하는 것을 정당화하는 기준은 무엇입니까?

분류에서Dev

반환하는 대신 파이썬 함수에서 print 문을 사용하는 것이 좋습니다

분류에서Dev

ID 이름 대신 변수 이름을 사용하는 jQuery

분류에서Dev

C ++에서 assert를 사용하는 대신 if 문을 사용할 수없는 이유는 무엇입니까?

분류에서Dev

? id = 30을 사용하는 대신

분류에서Dev

ID 대신 사용자 이름을 반환하는 방법

분류에서Dev

C #에서 공용 인스턴스 변수 대신 모든 속성을 사용하는 것이 바람직한 이유는 무엇입니까?

분류에서Dev

이미지 소스에서 URL 대신 문자열을 사용하는 방법

분류에서Dev

Yii 모델에서 ID를 사용하지만 URL에서 ID 대신 사용자 이름을 사용하여 사용자 페이지를 렌더링하는 방법

분류에서Dev

memset에 0 대신 '\ 0'을 사용하는 이유는 무엇입니까?

분류에서Dev

Float 속성이 작동하지 않습니다 (죄송합니다. 대부분의 사용자에게는 이것이 정말 사소한 일이라는 것을 알고 있습니다!)

분류에서Dev

플레이 북의 ansible 모듈 대신 플레이 북에서 Ansible-Galaxy 역할을 사용하는 것이 모범 사례입니까?

분류에서Dev

서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

분류에서Dev

django 데이터베이스가 새 개체에 대해 삭제 된 개체의 ID를 사용하는 것을 방지하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    이 특정 상황에서 subscribe () 대신 async-pipe를 사용하는 것이 정말 낫습니까?

  2. 2

    우리는 JMS를 사용하는 대신에 정보를 교환하기위한 REST 템플릿을 사용하여 얻는 이점은 무엇입니까?

  3. 3

    최신 Linux에서 noatime을 사용하는 것이 합리적입니까?

  4. 4

    세션에서 사용자 ID 또는 사용자 이름을 설정하는 것이 안전합니까?

  5. 5

    jQuery 플러그인에서 $ (this) 대신 이것을 사용하는 이유는 무엇입니까?

  6. 6

    jQuery 플러그인에서 $ (this) 대신 이것을 사용하는 이유는 무엇입니까?

  7. 7

    정의에서 "xor"대신 "or"를 사용하는 이유는 무엇입니까?

  8. 8

    정적 할당 대신 고정 길이 할당을 사용하는 이유는 무엇입니까?

  9. 9

    Firefox 7에서 최대 800MB의 RAM을 사용하는 것이 정상입니까?

  10. 10

    Vaadin에서 VerticalLayout 대신 FormLayout을 사용하는 이유는 무엇입니까?

  11. 11

    "/ etc / hosts"가있는 웹 사이트를 차단하거나 허용하는 것은 정말로 더 이상 사용되지 않습니까? 대신 무엇을 사용해야합니까?

  12. 12

    scikit-learn DecisionTreeRegressor에서 "X"대신 실제 기능 이름을 사용하는 방법은 무엇입니까?

  13. 13

    API Rest에 대한 URL을 사용하는 날짜 필터-Codeigniter

  14. 14

    "Rick and Morty"REST API를 사용하여 내 화면에 이름을 렌더링하려고하는데 말 그대로 렌더링되는 것이없고 상태가 업데이트되지 않습니다.

  15. 15

    하나 대신 여러 쿼리를 사용하는 것이 "정상"입니까?

  16. 16

    Ruby에서 클래스 대신 모듈을 사용하는 것을 정당화하는 기준은 무엇입니까?

  17. 17

    반환하는 대신 파이썬 함수에서 print 문을 사용하는 것이 좋습니다

  18. 18

    ID 이름 대신 변수 이름을 사용하는 jQuery

  19. 19

    C ++에서 assert를 사용하는 대신 if 문을 사용할 수없는 이유는 무엇입니까?

  20. 20

    ? id = 30을 사용하는 대신

  21. 21

    ID 대신 사용자 이름을 반환하는 방법

  22. 22

    C #에서 공용 인스턴스 변수 대신 모든 속성을 사용하는 것이 바람직한 이유는 무엇입니까?

  23. 23

    이미지 소스에서 URL 대신 문자열을 사용하는 방법

  24. 24

    Yii 모델에서 ID를 사용하지만 URL에서 ID 대신 사용자 이름을 사용하여 사용자 페이지를 렌더링하는 방법

  25. 25

    memset에 0 대신 '\ 0'을 사용하는 이유는 무엇입니까?

  26. 26

    Float 속성이 작동하지 않습니다 (죄송합니다. 대부분의 사용자에게는 이것이 정말 사소한 일이라는 것을 알고 있습니다!)

  27. 27

    플레이 북의 ansible 모듈 대신 플레이 북에서 Ansible-Galaxy 역할을 사용하는 것이 모범 사례입니까?

  28. 28

    서브 쉘에서 실행하는 것과 & 대 coproc 명령을 사용하는 것의 차이점은 무엇입니까?

  29. 29

    django 데이터베이스가 새 개체에 대해 삭제 된 개체의 ID를 사용하는 것을 방지하는 방법은 무엇입니까?

뜨겁다태그

보관