1

我们这里有一个 RESTful 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);

这解决了FilesController发送时http://myapi/customer/1/files

[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这有效并作为实体和实体ID传递1,但感觉不是最好的解决方案,有没有更好的方法来做到这一点,这是错误的吗?

4

1 回答 1

1

基兰是对的。Nuget Attribute Routing 似乎是您正在寻找的。

下面是它的样子:

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
    }
}
于 2013-11-04T16:38:40.357 回答