2016-09-15 3 views
1

Web Api 모범 사례를 사용하여 REST 서비스를 만들려고하고 있으며 처리 방법을 알 수없는 상황에 이르렀습니다.다른 동작을 동일한 서명이있는 웹 API 메서드에 매핑하는 방법

내가 그룹을 가지고 있고 각 그룹 안에 사용자가 있다고 상상해보십시오.

이 내 GroupController 같은 모습입니다 : 당신이 볼 수 있듯이 우리는 같은 클래스에서 동일한 서명을 가진 두 가지 방법이 없기 때문에, 내 두 번째 방법은 컴파일되지 않습니다

[RoutePrefix("api/v1/groups")] 
public class GroupsController : ApiController 
{ 
    [HttpGet] 
    [Route("{id:int}")] 
    public IHttpActionResult Get(int id) 
    { 
     return Ok(); 
    } 

    // I also want to add endpoint which fetches all the users inside of group and I'd like to do it like this: 
    [HttpGet] 
    [Route("{id:int}/users")] 
    public IHttpActionResult Get(int id) 
    { 
     return Ok(); 
    } 
} 

.

내 경로 템플릿은 STANDART처럼 보이는 :

config.Routes.MapHttpRoute(
       name: "DefaultRouting", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

나는 액션 메소드 이름을 매핑하지만 내 목표를 달성하기위한 더 나은 방법이 있는지 궁금 해서요 경로를 추가 할 수 있다는 것을 알고. RESTful 서비스 작성을위한 최상의 원칙을 고수하고 싶습니다. 아시다시피, 제안 사항 중 하나는 WCF 서비스에 더 일반적이므로 사용자 지정 액션 이름을 사용하지 않는 것입니다.

답변

3

MapHttpRoute() 스타일 라우팅 구성과 특성 기반 라우팅을 함께 사용하지 마십시오. 하나 또는 다른 것을 사용하는 것이 더 간단합니다 (나는 명시 적이며 더 명확한 클래스 메소드 이름을 허용하기 때문에 속성 기반을 선호합니다).

또한 속성 기반 라우팅을 활성화하는 데 필요한 메소드 (예 : config.MapHttpAttributeRoutes())를 호출하지 않는 것처럼 보입니다. 그래서 GetGroups(int id)GetUsersForGroup(int id)

+0

로 이동하여 "GetUsersForGroup (INT ID)를"그럼 내가 칠 수있을 것입니다 : 메소드 서명에 아무런 충돌이 없는지 확인하기 위해 다음과 같이

마지막으로, 나는 당신의 방법 이름을 바꿀 것 api/v1/groups/1/usersforgroup? – user2128702

+0

아니요, 속성의 경로는'api/v1/groups/1/users'입니다. 이것은 라우트가 메소드 이름에 종속되지 않으므로 속성 라우팅을 선호하는 이유이기도합니다. – toadflakz

+0

내가 "GetUsers (int id)"메서드를 눌렀을 것이고 실제로 그렇게 할 것입니다. 그래서 내가 당신의 대답을 대답으로 표시했습니다. – user2128702