웹 api 버전 전략


귀하의 API 버전 관리가 잘못되었습니다. 그래서 3 가지 다른 방법으로 결정했습니다.
결국, 나는 가장 공정하고 가장 균형 잡힌 방법이 모두를 똑같이 화나게하는 것이라고 결론을 내렸다. 물론 API 버전 관리에 대해 이야기하고 있지만 대단한 & # x201C; 탭 대 스페이스 & # x201D; 논쟁은 전적으로 다른 캠프에서 그렇게 많은 강한 신념을 보았습니다.
이것은 괜찮 았어. 내가 지었을 때 나는 뽑혔다? (HIBP)는 11 월 말에 몇 사람이 사용할 수있는 간단하고 빠른 서비스를 제공하기위한 것이 었습니다. 첫 번째 두 점은 달성되었지만 마지막 두 점은 달성되지 못했다고 생각합니다. 실제로는 첫 번째 주말까지 Google 애널리틱스에서 처리 할 수있는 것 이상 이었지만 실제로는 & # x201C; 몇 & # 201D;였습니다. 요점은 API를 작성할 때 미래를 항상 예상 할 수 없으며, 어느 시점에 이미 의존하고있는 것을 변경해야 할 수도 있다는 것입니다.
하지만 문제는 & # x2013; HTTP를 통해 API와 관련된 모든 것을 이야기 할 때마다 다음과 같은 일이 발생합니다.
여러분이 돌아가는 방법마다 & # x201C; 올바른 길 & # x201D; REST에 대한 많은 후진 및 전달, RESTful 인 경우, 그렇지 않은 경우 및 문제가있는 경우에도 그렇다. API 변경, 버전 관리에 미치는 영향, 어떻게해야하는지에 대한 여러 가지 아이디어가있는 이유, 궁극적으로 실제로 실제로 일을하는 것만 큼 중요하지 않은 이유에 대해 이야기 해 보겠습니다.
더 많은 위반 데이터를 가져옵니다.
동일한 API가 사이트의 검색 기능에 사용되고 이제는 스마트 폰 앱에서 침투 테스트 도구에 이르기까지 모든 것을 만드는 외부 당사자들에 의해 사용됨에도 불구하고 위의 응답은 처음에는 훌륭하게 작동했지만 제한적이었습니다. 예를 들어 다음과 같은 응답은 효과가 없습니다.
왜? 왜냐하면 & # x201C; BattlefieldHeroes & # x201D; 는 파스칼 방식으로되어 있기 때문에 하드 코딩 된 CSS 클래스 (비록 장기간 좋은 접근법은 아닐지라도)와 일치시키고 & #C20C; 안정적인 & #C20D; 참조 할 이름 (두 번째 위반이 있어도 변경하지 않으려는 경우)이지만 제목으로 표시하기에는 적합하지 않습니다. 이 모든 것은 Azure 테이블 저장소에서 나옵니다. 그런 다음 실제로 SQL Azure로 이동하여 실제로 위반을 설명하는 관계형 데이터를 가져옵니다. 그 관계형 스토리지의 속성 중 하나는 위에서 본 이름입니다.
내가 정말로하고 싶었던 것은 이와 비슷한 것입니다.
알 겠어? 위반의 이름에 대한 이전 지점에서는 name 속성에 여전히 해당 항목이 있지만 이제는 제목도 있습니다. 이것은 사람들에게 & # x2013; & # x201C; Battlefield Heroes & # x201D; & # x2013; 더 중요한 것은 Gawker가 다시 Pawn 된 경우 Gawker2014와 같은 이름을 지정할 수 있으며 제목은 Gawker (Syrian Electronic Army Attack) & # x201D; 그것은 무엇이 안정적이고 예측 가능하지 않은지에 따라 구분되며, 이는 사람들이 name 속성에 이미지 또는 기타 자산과 같은 종속성을 생성 할 수 있음을 의미합니다.
다른 데이터는 매우 명확해야합니다 : 위반 날짜, 시스템에 추가 된 날짜, 계정 수 (pwned), 위반 설명 (다시 말하면 어구를 조정해야하는 경우 변경 될 수 있음) 및 # x201C; DataClasses & # x201D; 많은 사람들이 요구했던 사항 중 하나는 위반 사항에 대한 설명 이었으므로 위반 사항에 대한 컬렉션을 통해 추가 할 수있는 것보다 훨씬 많은 특성이 있습니다. 이미 Pwned 웹 사이트 페이지에서 각 위반 사항 아래에 이러한 내용이 표시되어 있습니다 (이것이 내가 지금 설명 중 일부를 조정할 수있는 또 다른 이유입니다).
이것은 큰 변화입니다. API의 정서는 동일하지만 & # x2013; 계정 이름을 입력하고 위반 목록을 다시 받으십시오. & # x2013; 더 이상 문자열 이름 배열이 없습니다. 이전 API를이 API로 간단히 대체하면 물건이 손상됩니다. 아피스. 절대로 필요한 것. 진화해라.
소프트웨어가 진화하면 API의 버전을 변경해야합니다.
이것에 대해 & # x2019; 그냥 맑은하자 : 세계 이동합니다. HIBP 용 API는 약 2 개월 동안 지속되었지만 잘못 설계 되었기 때문에가 아니라 서비스가 예기치 않게 성공적으로 이루어 졌기 때문에 가능합니다. 나는 이런 종류의 문제를 좋아하며 그렇게해야합니다.
이제 나는 선택의 여지가 있었다. 내가 가진 것과 함께 할 수 있고 더 나은 방법으로 사람들을 박탈 할 수 있었고, 기존의 서비스에 새로운 방식으로 추가 할 수있었습니다. 또는 새로운 버전을 만들 수도 있었지만 (다른 엔티티에 같은 엔티티를 노출 했음에도 불구하고) 빌드 할 수있었습니다. 내가 제일 잘 아는 방법. (새로운 버전을 선택하기 전까지) 올바르게 모델화 된 불필요한 바이트가 없으며 궁극적으로 소비자에게 다가 가기 위해 노력하는 엔티티를 잘 나타내줍니다. & # x2019; 앱.
API를 가장 현명한 방법으로 사용할 때 새로운 버전의 API를 도입해도 아무런 문제가 없습니다. 꼭, & # x201C; 권리 & # x201D; 1 일부터 시작하지만 예상대로 & # x201C; 오른쪽 & # x201D; 일시적인 상태입니다. 이것이 우리가 버전을 사용할 수 있어야하는 이유입니다.
다양한 버전 관리 캠프.
그렇다면이 버전 관리 사업은 얼마나 힘들 수 있습니까? 나는 그것이 간단한 운동이어야한다는 뜻인가요? 문제는 그것이 매우 철학적으로 느껴지지만, 지금은 생각해 보지 못한 채 세 가지 공통적 인 사고 방식을 실제로 구현 한 방법에 대해 설명해 드리겠습니다.
URL : API 버전을 URL로 간단히 채 웁니다. 예를 들면 다음과 같습니다. haveibeenpwned / api / v2 / breachedaccount / foo 맞춤 요청 헤더 : 이전과 같은 URL을 사용하지만 & # x201C; api-version : 2 & # x201D; 수락 헤더 : 수락 헤더를 수정하여 버전을 지정합니다 (예 : & # x201C). 수락 : application / vnd. haveibeenpwned. v2 + json & # x201D;
이것에 많은 것들이 쓰여 있었고 나는 포스트의 끝에 그것들과 링크 할 것이지만, 요약 된 버전은 다음과 같다 :
엔티티를 나타내야하기 때문에 URL이 빨라집니다. 검색하는 엔티티가 위반 된 계정이고 위반 된 계정의 버전이 아닌 한 실제로는 동의합니다. 의미 상으로는 정확하지 않지만 사용하기 쉽습니다. 사용자 정의 요청 헤더는 실제로 자원을 설명하는 의미 론적 방법이 아니기 때문에 흡인됩니다. HTTP 사양은 accept 헤더를 통해 표현 된 리소스와 같은 특성을 요청하는 수단을 제공합니다. 이? 테스트하기가 쉽지 않아서 헤더를 받아들입니다. 더 이상 URL을 제공하지 않고 & # x201C라고 말하면됩니다. 여기에서 & # x201D를 클릭하십시오. 요청을 신중하게 작성하고 accept 헤더를 적절히 구성해야합니다. .
각 접근 방식에 대한 다양한 논거는 & # x201C;에서가는 경향이 있습니다. & # x20; right & # x2019; 방법은 있지만 실용적이지는 않습니다. & # x201; through ~ & # x201C; 이것은 소모품을 만드는 가장 쉬운 방법이므로 & # x20; right & # x2019; & # x201D;가됩니다. 하이퍼 미디어, 컨텐츠 협상, & # x201C; REST & # x201D; 모든면에서 다른 이슈들. 불행하게도 이것은 매우 자주 철학적으로 이루어지며 실제로 목표가되어야하는 것, 즉 작동하는 소프트웨어, 특히 API 용 소프트웨어를 제작하여 쉽게 소모 할 수 있도록 만들어야합니다.
안정된 계약을하는 것이 어리석은 일입니다!
이 방법 또는 방법으로하는 것에 대한 모든 격동 및 격노보다 더 중요한 것은 사람들에게 안정성을 부여하는 것입니다. API를 사용하기 위해 힘들게 벌어 들인 노력을 투자하면 API를 사용하지 않는 것이 좋을 것입니다.
솔직히, & # x201C; RESTful & # x201D; 대 단어 자체가 당신의 성공을 결정할 것만 같지 않은가? 그 토론을 & # x201C;로 바꾸십시오. 여기에 실용적인 이유가 있습니다. 이 말이 어울리는 이유는 다음과 같습니다. & # x201D; 그리고 나는 모든 귀가 없습니다. 문제는 심지어 시끄러운 토론에서 이성을 표명하는 목소리가 실제로 가장 좋은 접근 방식에 대한 의문을 남기므로 나는 타협에 도달했습니다. & # x2026;
다음은 선택할 수있는 HIBP API를 사용하는 3 가지 잘못된 방법입니다.
이제 3 가지 잘못된 방법 중 하나를 선택할 수있는 선택권을 부여하고 싶지만 분명히 잘못된 결정을 내렸을 것입니다. 대기 & # x2013; 뭐?! 즉, API를 구현하면 너무 소비하기 어렵고 학문적이거나 프록시에서 실패하거나 너무 무언가가 실패 할 가능성이 높습니다. 잘못된 방법을 1 개 선택하기보다는 3 가지 방법을 모두 잘못 결정했기 때문에 가장 나쁜 점을 선택할 수 있습니다.
잘못된 방법 2 - 맞춤 요청 헤더 :
필연적으로, 누군가 3 가지 방법을 제공하는 것은 잘못된 행동이라고 나에게 말할 것이다. 유지하기 위해 더 많은 코드 덩어리를 얻지 못 했습니까? 아니요, 이는 기본 웹 API 구현이 두 가지 속성으로 장식되었음을 의미합니다.
첫 번째 것은 단순히 RouteFactoryAttribute를 구현하는 라우팅 제약 조건입니다. 나는 경로를지나 그 경로에 매핑 할 수있는 버전을 전달한 다음 구현이 & # x201C; api-version & # x201D; 헤더 또는이 패턴과 일치하는 수락 헤더 :
이 중 하나에 지정된 버전이 라우팅 제약 조건에 지정된 버전과 일치하면 호출되는 메소드가됩니다. 이것은 CodePlex에서이 샘플을 간단하게 적용한 것입니다.
위의 GetV2 메서드를 장식하는 두 번째 특성은 Web API 2와 특성 라우팅 기능에 있습니다. 물론 웹 API에서 항상 라우팅을 수행 할 수 있지만 일반적으로 전역 적으로 정의되었습니다. 이와 같은 속성 라우팅은 경로 정의가 적용되는 컨텍스트에 경로 정의를 가져오고 어떤 경로로 어떤 컨트롤러 작업이 호출되는지 쉽게 알 수 있도록합니다. 또한 API를 호출하는 3 가지 잘못된 모든 방법을 구현하여 하나의 적절한 위치에 함께 배치 할 수 있음을 의미합니다.
따라서 간단히 말해서, 이것은 많은 kludge를 생성하지 않으며 유지 보수가 매우 쉽습니다. 3 가지 방법 모두 정확히 똑같은 결과를 반환 할 것이고 무엇보다 중요한 점은 안정적인 상태로 유지 될 수 있으며 결국에는 변화가 없으며 실제로는 하루가 끝날 때 가장 많이 변하는 것입니다. 당신이 선택하는 옵션에 관계없이 중요한 것. 전체 구현은 이제 사이트의 API 페이지에서도 명확하게 설명됩니다.
하지만 버전을 지정하지 않으면 어떻게 될까요?
당신은 내가 이미 말했던 것을 알 수 있습니다. & # x2019; 예, 그렇습니다. 지금하는 일을하면 & # x2013; 버전을 지정하지 않았습니다. & # x2013; 그러면 지금 얻은 것을 얻을 수 있습니다. 즉, 특정 버전에 대한 요청이 없으면 버전 1을 얻게됩니다.
나는 기본적으로이 시점에 도달했는지에 관계없이 그 점에 대해서는 상당히 괜찮습니다. 번호가 지정되지 않은 경우 최신 버전을 반환하는 사용자가 있지만 안정적인 계약 인 & # x201D; 전체 계약을 중단하는 IMH가 있습니다. 골; 오늘 API에서 얻은 내용은 내가 수정하면 내일 얻을 수있는 것과 완전히 다를 수 있습니다. 그것은 빨고 물건을 부러 뜨릴 것입니다.
3 가지 선택 사항이 있지만 개인적인 선호도는 & # x2026;
API와 HIBP 웹 사이트 자체의 기본 소비자를 모두 제어 할 수있는 사치를 가지고 있습니다. API를 사용하기위한 3 가지 옵션이 제공되었는데, 어느 옵션을 사용합니까?
필자는 수락 헤더를 통해 철수를 지정하기로 마음 먹었습니다. 나는 이것이 옳다고 생각하지 않으며 다른 것들은 틀린 것이지, 오히려 나는 이것이 두 가지 주요한 이유 때문에 가장 합당하다고 생각한다 :
URL이 변경되지 않아야한다는 데 동의합니다. URL이 리소스를 나타내는 것으로 동의하면 다른 버전의 리소스를 나타내지 않는 한 URL을 변경하지 않아도됩니다. foo에 대한 위반은 항상 foo에 대한 위반이며 foo에 대해 반환 된 데이터가 변경되어 foo의 위치가 변경되어야한다고 생각하지 않습니다. 수락 헤더는 여러분이 데이터를 어떻게 좋아하는지 설명합니다 : 이것은 HTTP 스펙의 의미이며 요청 동사의 의미가 많은 의미를가집니다 (예 : 가져 오기 또는 삭제 또는 게시), 클라이언트가 표현한 콘텐츠를 원하는 방식도 마찬가지입니다.
결코 다른 두 가지가 잘못되어 솔직히 API를 다른 사람과 공유 할 수있는 방법이 없다는 것을 의미하는 것은 아닙니다. & # x201C; 여기에서 & # x201D;를 클릭하면 가능합니다. 요청을 쉽게 구성하고 헤더를 관리 할 수 ​​있으므로이 경로를 따라갔습니다.
사실, 생각해 보니, 나는 또한 도메인 경로에있는 버전을 사용합니다. 왜? 이 API를 작성하는 과정에서 나는 쿼리하는 방법 (나중에 자세히 설명)과 반환하는 특성에 대해 사람들과 지속적으로 의견을 나눴다. & # x201C; 이봐, 여기 & # x2019; 생각 & # x201D; 그들은 그것을 클릭하기 만하면 결과를 얻는 것이 매우 중요합니다. URL 버저 닝 접근법을지지하는 사람들은 헤더에 의존 할 때이 작업을 수행 할 수 없습니다.
아, 그리고 저를 확인한 경우, 작성 당시에는 아직 API를 v2로 롤백하지 않았습니다. 검색이 발생했을 때 위반 데이터가 API에서 되돌아 왔으므로 초기로드시 모든 위반 사항을 소스에로드하지 않아도된다는 의미입니다 (데이터 세트가 확장됨에 따라 지속될 수 없음). 이렇게하면 여러 개의 발신 트래픽이 절약되어 사이트로드 속도 측면에서 사람들의 속도가 빨라지지만 결국에는 더 많은 작업이 필요하게됩니다. 계속 지켜봐.
끝내고.
분명히 나는 ​​모든 것이 잘못되었지만 정직하게 여기에 대해 약간의 혀를 썼다. 더 많이 읽으면할수록 더 많은 질문이 제기 될수록 모든 경로가 어떤 방향 으로든 더 틀리게 보인다. 실제로 나는 구현의 측면이 '& # x201C; wrong & # x201D; (적어도 두세 가지로 생각할 수 있습니다.) 그리고 자연스럽게 그 영향에 대한 잠재적 인 맹공격에 대비하고 있습니다. 문제는 각각의 옵션이 솔직하게 작동한다는 것입니다. 모든 실제적인 목적을 위해 서로 잘 작동합니다.
최종 결정을 내리고 API의 버전을 지정하는 방법을 고려하는 다른 사용자를 남겨 둘 수있는 경우 : 사용자가 API를 빌드하기 전에는 아무도 API를 사용하지 않습니다. 그말 질질 끌어. 이들 중 어느 것도 & # x201C; 나쁨 & # x201D; 어떤 유형의 의미에서, 그들은 단지 다른 것입니다. 그들은 모두 쉽게 소모 할 수 있고, 모두 동일한 결과를 반환하며, 아무도 프로젝트의 성공에 실제 영향을 미치지 않습니다.
참조.
스택 오버플로 : API 버전 관리를위한 우수 사례? (위대한 질문, 위대한 답은 & # x201C로 닫았지만 건설적인 것은 아니며 & # x201C; 도마뱀을 빌려주고 # x201D; 그날 아침 침대의 반대편에 나왔다) 어휘 범위 블로그 : REST는 어때? API 버전이 있습니까? CodePlex : 라우팅 제약 조건 샘플 (사용자 정의 헤더를 추가하여 버전 관리 API의 예제로 Microsoft & # x2019;의 웹 API 페이지에서 링크 됨) CodeBetter : RESTful 버전 관리 (여러 서비스에서 버전 관리 방법을 비교해보십시오.) 서비스 (매우 실용적이고 API가 변경 될 수있는 다양한 방법에 대한 설명) Vinay Sahni의 블로그 : 실용적인 RESTful API 설계 우수 사례 (& # x201C를위한 URL 버전 관리에 대한 논쟁 ; 브라우저 탐색 가능성 & # x201D;) Pivotal Lans : API 버전 관리 (충돌 의견을 잘 볼 수 있음) Web Stack of Love : 미디어 유형을 사용하는 ASP 웹 API 버전 관리 (버전 별 지원을위한 앱 만들기의 완벽한 엔드 투 엔드) 콘텐츠 협상)
안녕하세요, 저는 Troy Hunt입니다. 이 블로그를 작성하고 Pluralsight의 과정을 만들고 이벤트 및 교육 기술 전문가에게 전 세계를 여행하는 Microsoft Regional Director 및 MVP입니다.
안녕하세요, 저는 Troy Hunt입니다. 이 블로그를 작성하고 Pluralsight의 과정을 만들고 이벤트 및 교육 기술 전문가에게 전 세계를 여행하는 Microsoft Regional Director 및 MVP입니다.
다가오는 이벤트.
나는 보통 이것들을 둘러싼 개인 워크샵을 진행하고 있으며 앞으로있을 공개 행사는 다음과 같습니다 :
Pluralsight가 이미 없습니까? 10 일 무료 평가판은 어떻습니까? 그러면 내 수십 가지 코스 중 수천 개의 코스에 액세스 할 수 있습니다.
"The Cloud Never Goes Down", Azure SLA 및 기타 이용 가능한 퀴즈.
벨이 해킹 된 방법은 다음과 같습니다.
지금 구독하십시오!
저작권 2017, 트로이 헌트.
이 저작물은 Creative Commons Attribution 4.0 International License에 따라 사용이 허여됩니다. 즉, 관대하게 공유하고 속성을 제공하십시오.
부인 성명.
여기에 표현 된 의견은 내 자신의 것이며, 내가 일하는 사람들, 내 친구, 아내, 아이들 등을 반영하지 않을 수 있습니다. 누군가를 인용하지 않는 한, 그들은 내 자신의 견해 일뿐입니다.
고스트와 함께 게시 됨.
이 사이트는 Ghost에서 완전히 실행되며 친절한 지원 덕분에 가능합니다. Ghost 사용을 선택한 이유에 대해 자세히 알아보십시오.

네 가지 REST API 버전 관리 전략.
이 기사에서는 네 가지 일반적인 REST API 버전 관리 전략을 설명하고 xMatters에서 REST API 버전을 어떻게 설명하는지 설명합니다.
xMatters에서 우리는 SemVer 사양 & # 8211; 주요 변경 사항을 도입 할 때마다 API 주 버전을 업데이트합니다. 내부적으로 우리는 기능 및 하위 호환 업데이트를 추가 할 때마다 마이너 및 패치 버전을 업데이트합니다. xMatters REST API의 새 주요 버전을 출시 할 때 클라이언트는 기존 주요 버전을 계속 사용하거나 새 버전으로 마이그레이션하도록 선택할 수 있습니다.
REST는 오늘날 인터넷을 통해 제 3 자에게 서비스를 제공하는 데 사용되는 가장 뛰어난 아키텍처 스타일입니다. SOAP 또는 RPC와 같은 더 복잡한 프로토콜 대신 HTTP 표준을 사용합니다. REST가 성공적으로 성공한 이유는 웹이 어떻게 작동 하는지를 모방 한 것입니다.
Stateless : 요청간에 클라이언트 컨텍스트를 유지하지 않습니다. 캐시 가능 : HTTP 캐싱 규칙을 사용합니다. 클라이언트 / 서버 지향 : 클라이언트와 서버 간의 관심사를 분리합니다. 계층화 된 시스템 및 통합 인터페이스를 활용합니다.
네 가지 일반적인 REST API 버전 관리 전략.
REST API를 버전을 지정하는 네 가지 일반적인 방법이 있습니다.
1. URI 경로를 통한 버전 관리.
REST API를 버전 화하는 한 가지 방법은 버전 번호를 URL 경로에 포함시키는 것입니다.
이 전략은 xMatters는 물론 Facebook, Twitter, Airbnb 등과 같은 다른 회사에서도 사용됩니다.
이 솔루션은 URI 라우팅을 사용하여 특정 API 버전을 가리키는 경우가 많습니다. 캐시 키 (이 경우 URI)는 버전에 따라 변경되므로 클라이언트는 쉽게 자원을 캐시 할 수 있습니다. REST API의 새 버전이 릴리스되면 캐시의 새 항목으로 인식됩니다.
API의 내부 버전은 다음과 같습니다.
주 버전 : URI에 사용 된 버전이며 API에 대한 변경 내용을 나타냅니다. 내부적으로 새 주요 버전은 새 API를 만드는 것을 의미하며 버전 번호는 올바른 호스트로 라우팅하는 데 사용됩니다.
사소한 버전 및 패치 버전 : 클라이언트에 투명하며 내부 호환 기능을 통해 이전 버전과의 호환성을 유지합니다. 일반적으로 변경 로그에서 전달되어 클라이언트에게 새로운 기능이나 버그 수정에 대해 알립니다.
이 솔루션은 급격한 변경을 도입하면 전체 API를 분기하는 것을 의미하므로 코드 기반에 상당히 큰 밑넓이가 있습니다.
2. 쿼리 매개 변수를 통한 버전 관리.
REST API를 버전 관리하는 또 다른 옵션은 버전 번호를 쿼리 매개 변수로 포함시키는 것입니다.
이것은 구현 관점에서 API를 간단히 버전 화하는 방법입니다. 또한 쿼리 매개 변수가 지정되지 않은 경우 최신 버전으로 기본 설정하는 것이 쉽습니다.
URI 버전 관리와 비교할 때 가장 큰 단점은 라우팅의 어려움입니다. 실제로 쿼리 매개 변수는 요청을 적절한 API 버전으로 라우팅하는 데 사용하기가 더 어렵습니다.
3. 사용자 정의 헤더를 통한 버전 관리.
REST API는 특성으로 포함 된 버전 번호가있는 사용자 정의 헤더를 제공하여 버전을 지정할 수도 있습니다.
이 접근 방식과 두 가지 이전 버전의 주요 차이점은 URI를 버전 정보와 함께 혼란스럽게하지 않는다는 것입니다.
4. 내용 협상을 통한 버전 관리.
curl - H & # 8220; accept : application / vnd. xm. device + json; 버전 = 1 & # 8221; example / api / products.
우리가 다루고있는 마지막 전략은 컨텐츠 협상을 통한 버전 관리입니다.
이 방법을 사용하면 전체 API를 버전 화하는 대신 단일 리소스 표현을 버전화할 수 있으므로 버전 관리를보다 세부적으로 제어 할 수 있습니다. 또한 새 버전을 만들 때 전체 응용 프로그램을 포크 할 필요가 없으므로 코드 기반에서 더 작은 공간을 만듭니다. 이 방법의 또 다른 이점은 URI 경로를 통해 버전을 지정하여 도입 된 URI 라우팅 규칙을 구현할 필요가 없다는 것입니다.
이 접근법의 단점 중 하나는 URI 버전 API보다 액세스하기가 쉽지 않다는 것입니다. 미디어 유형이있는 HTTP 헤더가 필요하면 브라우저를 사용하여 API를 테스트하고 탐색하기가 더 어려워집니다.
콘텐츠 협상은 전체 API의 버전을 지정하는 대신 리소스 표현을 버전 화하기 때문에보다 세분화 된 방식이지만 클라이언트와 개발자 모두에게 높은 구현 비용도 함께 제공됩니다. 흔히 제공하는 라이브러리가 거의 없기 때문에 콘텐츠 협상을 처음부터 구현해야합니다. 다른 접근 방식은 구현하기 쉽고 사용하기가 쉽지만 API 계약의 변경 사항을 도입하는 데 드는 높은 비용 때문에 개발자가 리팩토링 기능을 제한합니다.
어떤 생각이나 추천? 아래에 의견을 남겨주세요!
무료 백서 : 표준 + 사례에 대해 알아보십시오.
Rob England의 IT에 대한 총체적인 접근 방법에 대한 자세한 내용은 블로그 (The IT Skeptic) 및 Plus! 표준 + 사례 접근법. 자세한 내용은 정의되지 않은 사례 관리 상황을 xMatters로 작성된 새로운 표준 응답 모델로 바꾸는 방법에 대한 Rob의 새로운 백서를 읽어보십시오. Standard + Case : IT 응답 모델이 현대 운영을 주도하는 방식.
주 버전에 따라 포장 (폴더)을 만들어야합니까?
또 다른 질문은, 데이터베이스 테이블에서 API를 변경해야하는 경우 스키마의 버전을 변경하는 방법입니다. 어떤 링크?
그다지 자주 문서화되지 않은 한 가지는 코드와 API가 지원하는 모든 버전을 관리하는 방법입니다.
나는 코드를 관리하고 버전 악몽을 피하는 데 좋은 패턴을 찾기를 원했다.
spring-webmvc에 대한 제 3의 접근 방식의 구현 :
관심이있을 수도 있습니다.
AT & T, HP 및 Intel과 함께 Airbnb 환경을 해킹 한 방법
새로운 ServiceNow 통합으로 해결 시간 단축.
Moogsoft와 xMatters Integration은 새로운 수준의 인시던트 관리를 구현합니다.
좀비 작업은 방송으로 중단 될 수 없습니다.
지원이 필요하십니까?
우리의 헌신적 인 커뮤니티 사이트는 모든 xMatters 제품에 대한 도움을 얻을 수있는 최고의 장소입니다. 당사의 전문가 지원 팀과 지역 사회 사용자가 올바른 대답을 얻을 수 있도록 지원합니다.

웹 API 버전 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
API 버전 관리 모범 사례? [닫은]
웹 서비스 REST API 버전 관리를위한 알려진 방법 또는 모범 사례가 있습니까?
나는 AWS가 엔드 포인트의 URL에 의한 버전 관리를한다는 것을 알았다. 이것이 유일한 방법입니까 아니면 같은 목표를 성취 할 수있는 다른 방법이 있습니까? 여러 가지 방법이 있다면 각 방법의 장점은 무엇입니까?
templatetypedef, amon, George Stocker & # 9830;에 의해 주로 의견 기반으로 마감되었습니다. 3 월 6 일 14시 13 분 22 초
많은 좋은 질문은 전문가의 경험을 토대로 어느 정도 의견을 제시하지만, 이 질문에 대한 답변은 사실, 참고 문헌 또는 특정 전문 지식보다는 의견에 거의 근거를 두는 경향이 있습니다. 이 질문을 도움말 센터의 규칙에 맞게 수정하려면 질문을 수정하십시오.
animuson 님에 의해 잠김 & # 9830; 3 월 8 일 16시 3시 40 분.
이 질문은 역사적인 의미가 있기 때문에 존재하지만이 사이트에 대한 주제에 관한 좋은 질문으로 간주되지 않으므로 여기에서 비슷한 질문을 할 수있는 증거로 사용하지 마십시오. 이 질문과 답변은 고정되어 있으며 변경할 수 없습니다. 추가 정보 : 도움말 센터.
이것은 좋고 까다로운 질문입니다. URI 디자인의 주제는 동시에 REST API의 가장 중요한 부분이며, 따라서 해당 API 사용자에 대한 잠재적 인 장기적 약속입니다.
응용 프로그램의 진화와 그보다 낮은 수준의 API는 삶의 사실이며 프로그래밍 언어와 같이 겉보기에는 복잡한 제품의 발전과 유사하기 때문에 URI 디자인은 자연적인 제약이 적어야하며 보존해야합니다. 시간이 지남에. 응용 프로그램과 API의 수명이 길어질수록 응용 프로그램과 API의 사용자에 대한 책임이 커집니다.
반면에, 또 다른 삶의 사실은 API를 통해 소비 될 모든 자원과 측면을 예측하기 어렵다는 것입니다. 다행히 Apocalypse까지 사용할 전체 API를 설계 할 필요는 없습니다. 모든 자원 및 자원 인스턴스의 모든 자원 끝점과 주소 체계를 올바르게 정의하면 충분합니다.
시간이 지남에 따라 각 특정 리소스에 새로운 리소스와 새로운 특성을 추가해야 할 수도 있습니다. 하지만 API 사용자가 특정 리소스에 액세스하기 위해 따르는 방법은 리소스 주소 지정 체계가 공개되고 최종적으로 변경되지 않아야합니다.
이 방법은 HTTP verb 의미론 (예 : PUT은 항상 업데이트 / 대체해야 함) 및 이전 API 버전에서 지원되는 HTTP 상태 코드에 적용됩니다 (사용자 개입없이 작업 한 API 클라이언트가 계속 작동 할 수 있어야 함). 그런 식으로).
또한 API 버전을 URI에 포함 시키면 시간이 지남에 따라 변할 리소스 주소 / URI가 있으므로 응용 프로그램 상태 엔진 (Roy T. Fieldings PhD 논문에서 언급 한)의 하이퍼 미디어 개념이 중단되므로 API 버전은 API 사용자가 의존 할 수있는 리소스 URI가 퍼머 링크가되어야 함을 의미하는 오랜 시간 동안 리소스 URI에 보관되어서는 안됩니다.
물론 기본 URI에 API 버전을 포함 할 수는 있지만 새 API 버전에서 작동하는 API 클라이언트를 디버깅하는 것과 같이 합리적이고 제한된 용도로만 사용할 수 있습니다. 이러한 버전이있는 API는 시간 제한적이어야하며 폐쇄 된 베타와 같이 제한된 API 사용자 그룹 만 사용할 수 있습니다. 그렇지 않으면, 당신은 당신이하지 말아야 할 곳을 저 지르게됩니다.
만료 날짜가있는 API 버전 유지에 관한 몇 가지 생각. 웹 서비스 (Java, PHP, Perl, Rails 등) 구현에 일반적으로 사용되는 모든 프로그래밍 플랫폼 / 언어는 웹 서비스 끝점을 기본 URI에 쉽게 바인딩 할 수 있도록합니다. 이렇게하면 여러 API 버전간에 파일 / 클래스 / 메소드 모음을 쉽게 수집하고 보관할 수 있습니다.
API 사용자 인 POV에서 특정 API 버전으로 작업하고 바인딩하는 것이 더 쉬울뿐만 아니라 제한된 시간 동안 (즉 개발 중에) 분명합니다.
API 관리자의 POV에서, (소스 코드) 버전 관리의 가장 작은 단위로 주로 파일에서 작동하는 소스 제어 시스템을 사용하여 다른 API 버전을 병렬로 유지하는 것이 더 쉽습니다.
그러나 API 버전이 URI에 명확하게 표시되어 있으면주의해야합니다. URI 기록에서 API 기록이 가시적으로 보이고 aparent가되므로 REST의 지침에 위배되는 시간이 지남에 따라 변경되기 쉽습니다. 나는 동의한다!
이러한 합리적인 반대를 피하는 방법은 버전없는 API 기본 URI로 최신 API 버전을 구현하는 것입니다. 이 경우 API 클라이언트 개발자는 다음 중 하나를 선택할 수 있습니다.
최신 API에 맞서 개발하십시오 (잘못 설계된 API 클라이언트를 깨뜨릴 수있는 API 변경을 막기 위해 응용 프로그램을 유지 관리해야 함).
제한된 시간 동안 만 API의 특정 버전에 바인딩됩니다 (명백 해짐).
예를 들어 API v3.0이 최신 API 버전 인 경우 다음 2 개는 별칭이어야합니다 (즉 모든 API 요청과 동일하게 작동해야 함).
또한 이전 API를 가리키는 API 클라이언트는 사용중인 API 버전이 더 이상 지원되지 않거나 더 이상 지원되지 않는 경우 최신 API 버전을 사용하도록 알려야합니다. 따라서 다음과 같은 쓸모없는 URI에 액세스하십시오.
Location URI 헤더와 함께 사용되는 리디렉션을 나타내는 30x HTTP 상태 코드 중 하나를 반환해야합니다. 이 상태 코드는 리소스 URI의 해당 버전으로 리디렉션됩니다.
API 버전 관리 시나리오에 적합한 리디렉션 HTTP 상태 코드가 두 개 이상 있습니다.
301 요청 된 URI를 가진 자원이 다른 URI (API 버전 정보를 포함하지 않는 자원 인스턴스 퍼머 링크 여야 함)로 영구적으로 이동되었음을 나타내는 영구적으로 이동되었습니다. 이 상태 코드는 버전이 지정된 리소스 URI가 리소스 퍼머 링크로 대체되었음을 API 클라이언트에 알리지 않고 더 이상 지원되지 않는 API 버전을 나타내는 데 사용할 수 있습니다.
302 요청한 리소스가 일시적으로 다른 위치에 있지만 요청한 URI가 계속 지원 될 수 있음을 나타내는 Found입니다. 이 상태 코드는 버전없는 URI를 일시적으로 사용할 수없고 리디렉션 주소 (예 : APi 버전이 포함 된 URI를 가리키는 등)를 사용하여 요청을 반복해야하며 클라이언트가 계속 사용하도록 알리고 싶을 때 유용합니다 (예 : permalinks).
URL에 버전이 없어야합니다. 이 버전은 요청한 리소스의 "아이디어"와 아무런 관련이 없습니다. URL을 원하는 개념에 대한 경로로 생각해야합니다. 즉, 항목을 어떻게 반환 할 것인지를 결정하는 것이 아닙니다. 버전은 객체의 개념이 아니라 객체의 표현을 나타냅니다. 다른 포스터가 말했듯이 요청 헤더에 형식 (버전 포함)을 지정해야합니다.
버전이있는 URL에 대한 전체 HTTP 요청을 살펴보면 다음과 같습니다.
헤더에는 요청한 표현이 들어있는 행이 있습니다 ( "Accept : application / xml"). 바로 그 버전이 있어야합니다. 모두는 당신이 다른 형식으로 동일한 것을 원하고 클라이언트가 원하는 것을 요구할 수 있어야한다는 사실에 대해 광택을주는 것처럼 보입니다. 위의 예에서 클라이언트는 리소스의 XML 표현을 요구합니다. 실제로 원하는 표현을 나타내는 것은 아닙니다. 서버는 이론적으로 XML 인 경우 요청과 관련이없는 무언가를 반환 할 수 있으며 잘못되었다는 것을 파싱해야합니다.
더 좋은 방법은 다음과 같습니다.
더 나아가, 클라이언트가 XML이 너무 장황하다고 생각하고 대신 JSON을 원한다고 가정 해 봅시다. 다른 예제에서는 동일한 고객에 대한 새 URL을 가져야하므로 다음과 같이 끝납니다.
(또는 비슷한). 실제로 모든 HTTP 요청에는 원하는 형식이 포함됩니다.
이 방법을 사용하면 훨씬 더 자유롭게 디자인 할 수 있으며 실제로 REST의 원래 아이디어를 고수하고 있습니다. 클라이언트를 방해하지 않고 버전을 변경하거나 API가 변경되면 점진적으로 클라이언트를 변경할 수 있습니다. 표현 지원을 중지하도록 선택한 경우 HTTP 상태 코드 또는 사용자 정의 코드로 요청에 응답 할 수 있습니다. 클라이언트는 응답이 올바른 형식인지 확인하고 XML의 유효성을 검사 할 수도 있습니다.
URL에 버전을 넣는 것이 나쁜 방법을 보여주는 마지막 예가 하나 있습니다. 오브젝트 내부에 정보를 원한다고 말하면서 다양한 오브젝트를 버전 관리했다 (고객은 v3.0, 주문은 v2.0, shipto 오브젝트는 v4.2). 다음은 클라이언트에서 제공해야하는 불쾌한 URL입니다.
우리는 버전을 URL에 넣는 것이 실용적이고 유용하다는 것을 알았습니다. 그것은 당신이 한 눈에 사용하고있는 것을 쉽게 알려줍니다. 허용 된 답변에서 제안하는 바와 같이 / foo / (가장 최신 버전)의 별칭 / foo를 사용 용이성, 더 짧고 / 깨끗한 URL 등을 위해 수행합니다.
하위 호환성을 영원히 유지하는 것은 종종 비용이 많이 들거나 매우 어렵습니다. 더 이상 지원 중단 될 것이라는 점, 여기에 제안 된 것과 같은 리디렉션, 문서 및 기타 메커니즘을 사전에 알리는 것이 좋습니다.
리소스 표현의 버전 관리가 REST 접근법을 따르는 것이 더 낫다는 것에 동의합니다. 하지만 사용자 정의 MIME 유형 (또는 버전 매개 변수를 추가하는 MIME 유형)의 큰 문제점 중 하나는 HTML 및 JavaScript의 Accept 및 Content-Type 헤더에 쓸 수없는 지원입니다.
예를 들어 리소스를 만들려면 HTML5 양식에 다음 헤더를 사용하여 POST 할 수 없습니다.
이것은 HTML5 enctype 속성이 열거 형이므로 일반적인 application / x-www-formurlencoded, multipart / form-data 및 text / plain 이외의 다른 것은 유효하지 않기 때문입니다.
. HTML4에있는 모든 브라우저에서 지원되는지 확신 할 수 없습니다 (좀 더 느슨한 encytpe 속성을 갖지만 MIME 유형이 전달되었는지 여부에 대한 브라우저 구현 문제 일 것입니다)
이 때문에 나는 URI를 통해 버전을 만드는 가장 적절한 방법이 있다고 생각하지만 올바른 방법이 아니라고 생각합니다.
귀하의 버전을 URI에 넣으십시오. 한 버전의 API가 다른 유형의 API를 항상 지원하지는 않기 때문에 리소스가 한 버전에서 다른 버전으로 마이그레이션된다는 논쟁은 명백히 잘못되었습니다. XML에서 JSON으로 형식을 전환하는 것과 같지 않습니다. 유형이 존재하지 않거나 의미 적으로 변경되었을 수 있습니다.
버전은 리소스 주소의 일부입니다. 하나의 API에서 다른 API로 라우팅합니다. 헤더에서 주소 지정을 숨기려면 RESTful이 아닙니다.
REST API에서 버전 관리를 할 수있는 몇 가지 장소가 있습니다.
언급 한 바와 같이, URI에서. 리다이렉트 (redirect) 등이 잘 사용된다면 이는 다루기 쉽고 심미적으로 즐겁다.
Accepts : 헤더에서 버전이 파일 유형에 있도록합니다. 'mp3'vs 'mp4'처럼. 이것은 IMO가 다소 덜 능숙하게 작동하지만 작동합니다.
자원 그 자체. 많은 파일 형식에는 일반적으로 헤더에 버전 번호가 포함되어 있습니다. 이것은 새로운 소프트웨어가 파일 형식의 모든 기존 버전을 이해함으로써 '정당한 작업'을 할 수있게하며, 구 버전의 소프트웨어가 지원되지 않는 (최신) 버전이 지정된 경우 펀트 할 수 있습니다. REST API의 컨텍스트에서 URI가 변경 될 필요가 없으며 전달 된 데이터의 특정 버전에 대한 응답 만 의미합니다.
세 가지 접근법을 모두 사용해야하는 이유를 알 수 있습니다.
'깨끗한 스윕 (clean sweep)'새로운 API를 원한다면, 또는 그러한 접근 방식을 원할 경우 주요 버전을 변경하십시오. 클라이언트가 PUT / POST를 수행하기 전에 클라이언트가 알 수 있도록하려면 작동 여부를 결정해야합니다. 클라이언트가 PUT / POST를 수행하여 작동 여부를 확인해야한다면 괜찮습니다.
REST API의 버전 관리는 다른 API의 버전 관리와 유사합니다. 사소한 변경 작업을 수행 할 수 있으며 주요 변경 사항에는 완전히 새로운 API가 필요할 수 있습니다. 가장 쉬운 방법은 매번 처음부터 시작하는 것입니다. URL에 버전을 넣는 것이 가장 적합합니다. 클라이언트의 삶을 편하게하려면 역 호환성을 유지하려고 노력합니다. 영구적 인 리디렉션, 영구적 인 리디렉션, 여러 버전의 리소스 등을 통해 수행 할 수 있습니다. 이는 더 까다 롭고 많은 노력이 필요합니다. 그러나 REST가 "멋진 URI는 변경되지 않습니다"에서 권장하는 사항이기도합니다.
결국 다른 API 디자인과 같습니다. 고객의 편의를 위해 노력하십시오. API에 대한 의미있는 버전 관리를 채택하는 것이 좋습니다. 그러면 클라이언트가 새 버전과의 하위 호환성 방법을 명확하게 알 수 있습니다.

웹 API 버전 관리 전략.
API를 변경하면 변경 사항이 적용되기 전에 사용했던 방식대로 API를 계속 사용할 수 있어야합니다. 여기에서 버전 관리가 필수적입니다. 이것은 API가 현재 소비하는 방식을 깨지 않으면 서 새로운 기능을 추가하기 위해 진화하는 방식입니다. 제 견해로, 이것은 새로운 어셈블리 버전이나 새로운 빌드와 같지 않습니다. 소비자가 API에서 볼 수없는 뒤에서 변경 한 사항은 새 버전의 API가 필요하지 않습니다. 새 버전의 API는 "부품 변경을 소비하는 방법"이있을 때만 배포해야합니다. 예 : 자원 또는 서명이 변경되는 경우
API가 약간 복잡하고 광범위한 소비자에게 서비스를 제공하는 경우 API 버전 관리가 필수입니다. 다른 접근 방식이 존재합니다. 나는 ASP 웹 API 버전 관리 접근법에 관해 그들 모두를 만져보고 최상의 접근 방법을 제안 할 것이다. 나는 독자들에게 적절한 예와 칭의를 설득하려고 노력할 것이다.
접근법 # 1 : URI 버전 관리.
URI에 버전 번호를 추가하면 해당 URI가 해당 컨트롤러의 메서드에 매핑됩니다.
쉽게 구현할 수 있습니다. 메소드에 대한 라우팅 속성을 사용하여 간단하게 처리 할 수 ​​있습니다.
위의 접근 방식으로 제약 조건 중 하나를 위반합니다. URI는 리소스를 나타내며 리소스가 변경되지 않는 한 URI도 변경되지 않아야합니다. 물론 동일한 리소스에 대한 URI가 동일하게 유지되면 안됩니까? 자원 자체의 새 버전이 변경되면 새 URI가 유효한 접근 방식이어야합니다. 완전히 다른 URI로 액세스 가능하게 할 수도 있습니다. 그 맥락에서 새로운 버전의 리소스는 다른 리소스입니다.
이 방법이 자주 사용됩니다. 이 장점 중 하나는 브라우저의 내보내기 가능성입니다. Fiddler와 같은 응용 프로그램으로 해결하지 않고도 웹 API에 대한 사용자 지정 요청을 보낼 수 있으므로 여러 버전의 웹 API에 액세스 할 수 있습니다. 그래서 우리는 이것을 실용적 접근으로 분류 할 수 있습니다.
접근법 # 2 : 내용 협상.
앞의 예에서 내용 유형을 application / json 또는 application / xml으로 설정하여 메시지를 JSON 또는 XML로 가져옵니다. Accept Header의 Custom Content Type을 통해 웹 API에 accept 헤더에 반환 할 버전을 알려주는 사용자 지정 컨텐츠 유형을 만들 수 있습니다.
여기서 JSON 형식으로 데이터가 필요하다는 것뿐만 아니라 버전에 대한 정보도 제공합니다. 이러한 API를 만들려면 공급 업체 접두사 "vnd"를 사용해야합니다. 이는 콘텐츠 유형이 공급 업체별이며 맞춤 식별자, 버전 및 리소스 형식이 뒤에 있음을 나타냅니다.
이 접근 방식에서는 브라우저에서 API를 탐색하기가 더 어려워집니다. API 메소드를 호출하려면 해당 요청 헤더를 사용하여 요청을 작성해야합니다.
접근법 # 3 : 사용자 정의 요청 헤더.
세 번째 방법은 버전 번호가 포함 된 요청에 사용자 정의 헤더를 추가하는 것입니다. 접근 방식 # 2이지만 맞춤형 콘텐츠 유형은 없습니다.
여기서 API는 맞춤 헤더를 읽고 해당 정보에서 올바른 버전의 코드를 실행해야합니다.
찾아보기가 약간 더 어려워서 요청은 맞춤 요청 헤더로 만들어야합니다.
위에서 설명한 접근법을 조합하여 사용할 수도 있습니다. 마찬가지로 주요 버전은 URI를 통해 요청되며 부 버전은 요청 헤더를 통해 요청됩니다.
접근법 # 4 : URI 매개 변수 버전 지정.
이것은 내가 사용하는 많은 사람들을 보지 못하는 명백한 하나입니다 :
이 방법은 Amazon, Google 및 Netflix에서 많이 사용되지만 그다지 인기가 없습니다. 클라이언트는 그가 원하는 버전을 알고 있으며 웹 API 공급자는 여러 버전을 유지 관리하는데 아무런 문제가 없습니다. 버전이 지정되지 않으면 클라이언트는 최신 또는 기본 버전을 가져옵니다. 최신 버전은 URL 매개 변수를 사용하면서 리소스 이름과 위치를 변경하지 않으므로 기존 하이퍼 링크를 손상시키지 않습니다.
서버 쪽에서는 서버가 요청을 라우팅 할 위치를 알기 전에 전체 매개 변수 문자열을 구문 분석해야하므로 피하려고 시도하는 것이 더 어려워집니다. 또한 버전 번호를 URI에 넣지 않는 것과 동일한 인수가 있습니다. 매개 변수는 구현의 속성이 아닌 서비스 기능을 지정하기위한 것입니다.
ASP 웹 API 구현 예 :
접근법 # 1 :
이처럼 간단하게 라우팅 속성에서 버전을 변경하기 만하면됩니다. 그래서 다른 두 가지 방식 인 Custom Content Type과 Custom Request Header에 더 많은 관심을 기울이고 싶습니다.
접근법 # 2 :
소비자가 특정 URI에 대한 리소스 표현을 요청하면 사용자 지정 콘텐츠 형식 요청을 읽어야합니다. 요청 헤더를 사용하여 API 메소드를 읽을 수 있고 헤더에서 무엇을 찾았는지에 따라 올바른 코드를 실행하지만 API 메소드 내에서 이렇게하는 것이 요청이 동일한 컨트롤러 및 메소드에서 끝나기 때문에 최선의 방법이 아닙니다. 우리는 그것을 처리해야합니다.
이 접근법은 Custom Route Factory 속성 및 사용자 지정 라우팅 제약 조건을 통해 더 잘 구현됩니다. 사용자 지정 제약 조건에서 두 버전의 버전을 모두 구현할 때 accept 헤더 또는 사용자 지정 요청 헤더를 확인할 수 있습니다. 그런 다음 사용자 지정 경로 팩토리 속성은 해당 제약 조건을 사용하며 각 제약 조건은 지정된 요청에서 경로를 차단할 수있는 기회를 갖습니다.
각 속성 경로에 제약 조건을 추가 한 다음 잠재적으로 경로를 차단하는 버전 별 경로 지정 경로 속성을 만들려고합니다. 이것은 우리가 컨트롤러 또는 그 속성을 가진 컨트롤러의 특정 메소드를 꾸밀 수있게 해줍니다.
요청이 Google의 제약 논리와 일치하면 올바른 경로를 허용하고 else는 경로를 차단합니다. 일반적인 방법으로 구현하려면 사용자 정의 클래스 "버전 제약"의 수정 된 버전이 있습니다.
약 클래스의 구현 후 웹 API 방법.
Approach # 2 사용자 정의 컨텐츠 유형 (예 : accept 헤더) :
헤더에 사용자 지정 콘텐츠 형식을 사용하여 버전을 지정하기위한 샘플 GET 버전 1 메서드 :
(버전 1 호출 예제는 Approach # 2 및 Approach # 3과 유사합니다)
실행 : API / report / 1 URI 버전 # 1로 요청이 호출됩니다.
이제 버전 # 1의 요청이 위의 경로와 일치합니다. 버전을 # 1과 기본 버전으로 언급 했으므로 헤더에 버전을 전달하지 않으면 기본 버전 # 1이 실행됩니다.
수락 헤더에서 사용자 지정 콘텐츠 형식으로 버전 지정하기위한 샘플 GET 버전 2 메서드 :
실행 : 이제 사용자 정의 요청 헤더에서 버전 # 2를 호출합니다.
동일한 get 호출 URI를 사용하십시오 : API / report / 1.
수락 : application / vnd. ServiceAPIname. v2 + json (URI가 아닌 수락 헤더에서 지정)
이제는 버전 # 2 get 메소드를 호출합니다.
사용자 지정 요청 헤더를 사용하여 버전 관리하기위한 샘플 GET 버전 1 메서드 :
실행 : API / report / 1 URI 버전 # 1로 요청이 호출됩니다.
이제 버전 # 1의 요청이 위의 경로와 일치합니다. 버전을 # 1과 기본 버전으로 언급 했으므로 헤더에 버전을 전달하지 않으면 기본 버전 # 1이 실행됩니다.
사용자 지정 요청 헤더로 버전 관리하기위한 샘플 GET 버전 2 방법 :
실행 : 이제 사용자 정의 요청 헤더에서 버전 # 2를 호출합니다.
동일한 get 호출 URI를 사용하십시오 : API / report / 1.
API 버전 : 2 (URI가 아닌 요청 헤더에 지정)
이제 버전 # 2 메소드가 호출됩니다.
페이스 북과 트위터는 전체 URL이 리소스 식별자라고 말할 수 있기 때문에 API 서비스 정의 이전과 리소스 정의 자체 (예 : / v2.7 /) 앞에 오는 URL 부분을 사용하고 있습니다.
그러나 일부는 리소스 식별자가 HOST 및 API SERVICE 식별자 이전에 오는 것임을 말할 수 있습니다. 트위터 API를 사용할 때 api. twitter / 1.1 / blocksabc, 여기 HOST = api. twitter, API Service = 블록 및 API 서비스 정의 1.1 이전의 API 서비스 버전을 사용할 때 좀 더 명확합니다.
결론.
모든 버전 관리 체계는 필요가 없다면 문제가됩니다. 클라이언트가 거의 없다면 버전 관리가 필요하지 않습니다. 예를 들어, 단 하나의 클라이언트를 가진 팀은 말도 안되는 버전 관리 체계를 고집합니다. 자원 유형이 이전 버전과의 호환성을 손상시키지 않도록 변경해야합니다. 나는 많은 프로젝트에서 "v1 / GetData"와 같은 리소스 URL에서 "V1"을 사용하고 "V2"로 변경하지 않습니다. 이러한 시나리오에서는 버전 관리가 필요하지 않습니다.
나는 Approach # 3 & # 8211; 강력한 이유가있는 사용자 정의 헤더. 나는 왜 내가 다른 사람들을 싫어하는지 정당화 할 것이다. URL 관계는 리소스 및 동작 변경과 관련된 버전 관리에 좋습니다 (이제는 "사용자"에서 "고객"으로 이동하여 백 엔드 청구 및 처리는하지만 리소스 자체의 구조는 변경하지 않음). 하지만 OAuth 1.0에서 OAuth 2.0으로 변경하는 것과 같이 다른 레이어에서 무언가를 변경해야하는 경우는 어떨까요? 아니면 회사로서의 피벗을하고 있습니까? 아니면 내가 아직 생각조차하지 못한 다른 것? 헤더가 더 높은 계층에있는 리소스 표현에 대해 단순히 작업을 수행하기 때문에 URL 접근 방식이 마음에 들지 않습니다. 필자는 헤더 버저 닝을 결코 변경하지 않기를 희망하지만, 필요한 매개 변수로 사용하면 원하는 것을 지정하지 못한 통합을 결코 깨뜨릴 수 없습니다. 페이스 북과 트위터가 그렇게했고 개발자 커뮤니티가 잘 받아들이지 못했습니다. Google API에 대한 첫 번째 요청은 오류 응답에서이 필수 매개 변수를 지우고 일단 처리되면 다시는 생각해 보지 않습니다. 당신이 말했듯이, 프록시는 오늘 그것을 잘 처리합니다. 나는 또한 우리가 "X-"컨벤션을 탈락시킬 수 있다는 점을 읽었습니다. 커스텀 헤더가 전 세계적으로 받아 들여질 길에있을 것이라고 생각하지 않기 때문입니다.
특히 사용자 지정 HTTP 헤더를 사용하는 것은 리소스 수준이 아닌 API 서비스 수준에서 버전이 필요한 경우 특히 그렇습니다.
사용자 지정 요청 헤더를 통해 Approach # 3 Versioning을 구현하는 것이 좋습니다. 우리는 URI 버전 관리에서 발생하는 자원 및 기능 유지 관리 원칙을 어 기지 않습니다. 이러한 방식으로 이전 버전에 액세스하려는 소비자를 방해하지 않으면 서 웹 API가 내장 된 버전 관리를 통합 할 수 있습니다. 소비자는 URI에서 버전 관리의 복잡성에 직면하지 않고 요청 헤더에 지정하지만 더 이상 버전을 지정하지 않으면 기본 버전이 응답을 보냅니다. 따라서 도달 할 수없는 경로의 URI 충돌을 방지합니다.
Microsoft ASP 웹 API의 API 버전 관리 지원을위한 라이브러리는 NuGet 패키지로 제공됩니다. ASP 웹 API 버전 관리 지원을 설치하려면 패키지 관리자 콘솔에서 다음 명령을 실행하십시오.
PM & gt; 설치 패키지 SDammann. WebApi. Versioning - Version 2.8.0.
더 높은 버전의 GET 메소드는 브라우저를 통해 액세스 할 수 없습니다. 대신 Fiddler와 같은 웹 디버깅 도구를 사용하여 적절한 API 버전 번호로 요청 헤더를 구성해야합니다.
이 접근법은 API 게이트웨이를 사용할 때 상당히 문제가 될 수 있습니다. "api-version"헤더를 보내면 정확히 어떤 API를 참조하는지 오해의 소지가 생길 수 있습니다. API 서비스 (자체적으로 버전 관리 할 수 ​​있음) 또는 얻을 수있는 웹 API 서비스 인 API 서비스 API 게이트웨이로부터의 호출.

Comments

Popular Posts