2013-11-04 3 views
1

우리는 여기에 편안한 WebAPI 서비스를 가지고 난 다음에 대처하기 위해 내 코드 및 라우팅을 구성하기 위해 무엇을해야하는지에 대해 궁금했는데 :REST WebAPI - 작업 및 하위 컨트롤러는 어떻게됩니까?

http://myapi/customer/1/files 

http://myapi/customer/1/files/3 

그래서 I 기본적으로 고객 정보를 관리하는 고객 컨트롤러와 파일 정보를 관리하는 파일 컨트롤러가 있으며, 고객 1의 모든 파일을 원한다면 첫 번째 요청을 수행 할 수 있습니다.

는 정말 고객의 맥락에서 그것을 관리하지 않으므로 파일에 내 GET이 파일에 대한 ID에 초점을 때, 나는 그것을 과부하해야하고 할 것

http://myapi/files/?customer=1&files=all 

첫 번째 해결 방법보다 깨끗하게 보입니다. 순간

나는 다음과 같은 한 : http://myapi/customer/1/files를 보낼 때 FilesController로 확인

config.Routes.MapHttpRoute(name: SubController, routeTemplate: "{entity}/{entityid}/{controller}/", defaults: null); 
config.Routes.MapHttpRoute(name: SubControllerAndId, routeTemplate: "{entity}/{entityid}/{controller}/{id}", defaults: null); 

:

이 작동하고 엔티티 ID로 엔티티로 customer1에 전달
[HttpGet] 
    public HttpResponseMessage Get(string entity, string entityid, int id) 
    { 
     var item = "Hello " + entity + " " + entityid + " " + id; 
     return Request.CreateResponse(HttpStatusCode.OK, item); 
    } 

[HttpGet] 
    public HttpResponseMessage Get(string entity, string entityid) 
    { 
     var item = "Hello " + entity + " " + entityid; 
     return Request.CreateResponse(HttpStatusCode.OK, item); 
    } 

,하지만 그것은 최선의 해결책처럼 느껴지지 않습니다. 더 좋은 방법이 있습니까? 잘못입니까?

+0

난 당신이 반대, HTTP를 의미 생각? –

+0

@PedroWerneck 아니, 내가 쓴 것이 맞다. :) 고객의 ID를 중점적으로 다루기 때문에 잘못하기 전에 고객의 모든 파일을 받아 들인다. –

+0

. 어쨌든, 당신 문제는 정말로 저에게 분명하지 않습니다. –

답변

1

키란이 맞습니다. Nuget 속성 라우팅은 당신이 찾고있는 것 같습니다.

을 Heres의이 같은 모습 방법 : 오른쪽 // myapi/파일/고객 = 모든 및 파일 = 1 :

public class CustomerController : ApiController 
{ 
    [HttpGet] 
    [GET("api/customer/{id}/files")] 
    public HttpResponseMessage Get(int id) 
    { 
    //code 
    } 

    [HttpGet] 
    [GET("api/customer/{id}/files/{fileId}")] 
    public HttpResponseMessage Get(int id, int fileId) 
    { 
    //code 
    } 
} 
+0

참고 : Web API 2를 사용할 수 있으면이 패키지가 이미 포함되어 있습니다 (Web API에 NuGet 패키지가 포함됨). – danielrozo

+0

참고 : 웹 API 2의 내장 된 속성 라우팅을 참조했습니다 :-) –

+0

합리적인 것으로 들리므로 아마도 '올바른'방법은 엔티티 컨트롤러 내의 모든 하위 항목에 대한 로직을 넣는 것입니까? 이미 다른 컨트롤러로 존재했던 몇 가지 '액션'이 있다면 어떻게 확장 할 수 있습니까? 주문, 파일, 사용자 데이터 등? –