2013-11-04 21 views
1

我們這裏還有一個RESTful的WebAPI服務,我一直在想,怎樣做來構建我的代碼和路由,以應對以下幾點:REST WebAPI - 動作和子控制器如何?

http://myapi/customer/1/files 

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

所以我基本上有一個管理客戶信息的客戶控制器和一個管理文件信息的文件控制器,如果我需要客戶1的所有文件,我可能會執行第一個請求。

我真的不希望在客戶的背景來管理它,所以當我在文件上GET集中在一個文件中的ID,我會過載,並做

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

它似乎比第一個解決方案乾淨一點?

此刻,我有以下幾點:

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

發送時http://myapi/customer/1/files它解決的FilesController

[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); 
    } 

這工作,並在customer作爲實體和1通過爲實體ID ,但它不覺得是最好的解決方案,有沒有更好的方法來做到這一點,這是錯的?

+0

我認爲你的意思相反,HTTP:// myapi /文件/客戶=所有與文件= 1,對不對? –

+0

@PedroWerneck不,我寫的是正確的:) - 在客戶1 –

+0

之前獲取所有文件,然後在您的短語出錯之前獲取所有文件,因爲您的GET關注的是客戶的ID。無論如何,你的問題對我來說真的不清楚。 –

回答

1

基蘭是對的。 Nuget屬性路由似乎是你在找什麼。

繼承人的怎麼會看起來像:

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,這已經包含了(它們只是將NuGet包括到Web Api中)。 – danielrozo

+0

注意:我指的是Web API 2的內置屬性路由:-) –

+0

聲音合理,所以推測「正確」的方法是將任何子項的邏輯放置在實體控制器中?如果我已經有其他控制器已經存在的幾種不同的「操作」,這是如何擴展的?訂單,文件,用戶數據等? –