2011-04-12 2 views
4

ASP.NET MVC 3을 사용하여 REST API를 만드는 것이 가장 좋은 방법인지 궁금합니다. 지금은 REST API의 각 버전에 대한 컨트롤러를 만드는 것을 생각하고 있습니다.ASP.NET MVC 3으로 구축 된 REST API의 버전 관리 - 모범 사례

public class V1Controller : Controller 
{ 
    public V1Controller() 
    { 
    } 

    public ActionResult GetUser(string userId, IUserRepository userRepostory) 
    { 
     //code to pull data and convert to JSON string 
     return View("Results"); 
    } 

    public ActionResult GetUsersByGroup(string groupId, IUserRepository userRepostory) 
    { 
     //code to pull data and convert to JSON string 
     return View("Results"); 
    } 
} 

그럼보기에 I가 _ViewStart.cshtml 레이아웃을 제거 덮어 다음 I 바로 바로 컨트롤러 액션으로 포맷 된 데이터를 출력 Results.cshtml있다 : 예를 들어, 지금까지 I은 할 지금 JSON. 하나의 컨트롤러에서 모든 REST 호출을 너무 많이하는 것 같지만 API의 버전 2를 만들 때 깨끗한 별도 버전의 API를 유지할 수 있도록 내가 생각할 수있는 최선의 방법입니다. V2Controller를 만들고 기존 API를 중단하지 말고 사람들에게 새로운 API로 전환 할 시간을줍니다.

ASP.NET MVC 3에서 REST API를 만드는 더 좋은 방법이 있습니까?

+0

버전 관리에 대해 질문하는 것 같습니다. 제 생각에는'V1Controller'는 좋은 습관이 아닙니다. MVC 프로젝트에서 모든 버전을 하나의 '컨트롤러'에 혼합했습니다. 나는 버전이 소스 제어의 역사에서 태그/포크 여야한다고 생각하고 있습니다. REST 서비스 만 제공하면 문제가되지 않지만 MVC에는 웹 사이트 + REST가 포함되어 있어야합니다. 그렇다면 웹 사이트가 최신 REST 만 사용하는 동안 REST의 버전 관리를 게시하려면 어떻게해야합니까? 그런 다음 웹 사이트 용으로 2 MVC 프로젝트를 만들고 나머지는 REST 서비스 용으로 만듭니다 (그러나 WCF가 아닌 이유는 무엇입니까?). MVC 프로젝트에서 모두 처리해야 다시 원래 생각으로 돌아와! – CallMeLaNN

답변

1

반환하려는 항목이 모두 JSON 인 경우보기가 필요하지 않습니다. Jusr return

new JsonResult(){Data = Data}; 

here에서 찾으십시오.


또한 버전 관리 측면에서 버전은 동일한 컨트롤러에서 다른 컨트롤러 또는 추가 메서드로 구현할 수 있습니다. 그러나 버전이 필요한 이유와 클라이언트 (브라우저라고 가정)가 버전 관리에 대해 알아야 할 이유가 귀하의 질문에서 명확하지 않은 이유를 모른 채로.

+2

"클라이언트"는 API를 사용하는 사람입니다. 버전을 가질 수있는 능력에 대한 추론은 API를 변경하도록 변경합니다. API 버전을 사용하면 API의 이전 버전을 사용하는 모든 사용자를 차단할 가능성이 없어집니다 (100 %가 아니라 대다수). – ryanzec

+0

버전 관리는 엔터프라이즈 시나리오에서 중요합니다. 팜에 여러 서버가있는 여러 클라이언트가 엔터프라이즈 전체에 퍼져있는 여러 환경이 거의 필요합니다. –

0

예제 코드에 게시 한 것과 같은 컨트롤러에는 항상 동일한 서명이있는 예 : GetUsersByGroup()의 메서드를 유지해야합니다. 나는 그 방법의 다른 버전이 어떻게 될지 모르겠다.

입력 내용은 그룹 및 리포지토리입니다 (DI에서 제공 한 것임). 결과는 JSON 형식의 사용자 목록입니다. 이것이 바로 API 사용자에게 중요한 사항입니다. 이 방법으로 당신이하는 일은 아무도 없습니다.

더 많은 입력과 출력을 생각해야합니다. 기존 액션의 서명을 변경하지 않아야합니다.

인터페이스 구현과 관련하여 컨트롤러 클래스를 생각해보십시오. 당신은 인터페이스와 컨트롤러 클래스를 가지고 있습니다. (구현할 필요는 없지만 그런 식으로 생각하면됩니다.) 하나 또는 여러 클래스가 인터페이스를 구현하면 인터페이스를 거의 변경하지 않습니다. 그러나 당신은 그것에 방법을 추가 할 수 있습니다. 또한 클래스를 구현할 때만 변경하면됩니다. API의 기능을 손상시키지 않으며 API를 사용하는 모든 사용자는 API를 계속 사용할 수 있습니다.

2

MVC의 영역 사용을 사용하여 적절한 솔루션을 찾을 수있었습니다.

:

http://[website]/[major_version]_[minor_version]/{controller}/{action}/... 

가 나는 또한 별도의 프로젝트 파일의 다른 버전을 나누고 각 버전에서 동일한 컨트롤러 이름을 사용하고 싶었 :

첫째, 나는 내 API가이 URL 정의를 따라하고 싶어

"../v1_0/Orders/ViewOrders/.." => "../v2_3/Orders/ViewOrders/.." 

저는 MVC 영역을 사용하여 검색 할 수있는 유용한 솔루션을 발견했습니다.

using System.Web.Mvc; 

namespace Api.Controllers.v1_0 
{ 
    public class SystemController : Controller 
    { 
     public ActionResult Index() 
     { 
      return new ContentResult() {Content = "VERSION 1.0"}; 
     } 
    } 
} 

그때 :

나는 시험으로, 거기에 SystemController.cs에게 파일을 넣어 "Api.Controllers.v1_0"라고 내 솔루션에 새로운 프로젝트을 생성 나는에 대한 동일한 단계 위를 걸었다

using System.Web.Mvc; 

namespace Api.Controllers.v1_0 
{ 
    public class v1_0AreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get{ return "v1_0";} 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "v1_0", 
       "v1_0/{controller}/{action}/{id}", 
       new { controller = "System", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

하십시오 v1_0AreaRegistration.cs 파일을 추가 ".. v1_1"프로젝트와 거기에있는 해당 파일이 내 "Api.Web"MVC 프로젝트에 참조로 프로젝트를 추가하고 꺼져서 실행 중이었습니다.

+1

또한 낮은 버전 컨트롤러에서 상위 버전 컨트롤러를 상속 받도록 고려하여 동작을 변경하는 대신 변경된 동작 만 구현해야합니다. 또한 모델 객체에 대해 동일한 접근법을 사용하는 것도 고려하십시오. –