WEB API Controller中的多个Get函数

问题描述 投票:0回答:4

我正在创建一个 Web Api 控制器。我想在单个控制器中创建多个 Get 函数。见下文:

    // GET api/User/5
    [ResponseType(typeof(UserModel))]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

下面是我的 WebApi 路由配置

 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Controllers with Actions
        // To handle routes like `/api/VTRouting/route`
        config.Routes.MapHttpRoute(
            name: "DefaultApiwithActionID",
            routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional } 
        );
    }

下面是我的 API 控制器

       // GET api/User/5
    [ResponseType(typeof(UserModel))]
    [Route("api/UserApi/GetUser")]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/5
    [ResponseType(typeof(TanentDocumentsModel))]
    [Route("api/UserApi/GetUserDocuments")]
    public IHttpActionResult GetUserDocuments(Guid id)
    {
        var item = repository.GetUserDocuments(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    [Route("api/UserApi/GetCities")]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(StateModel))]
    [Route("api/UserApi/GetStates")]
    public IHttpActionResult GetStates(int id)
    {
        var item = repository.GetStates(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

我该怎么做才能通过 URL 调用这两个函数?

c# asp.net-mvc asp.net-web-api asp.net-web-api-routing
4个回答
4
投票

使用在方法和 webapiconfig 文件中指定的路由。

喜欢 关于方法

[ResponseType(typeof(UserModel))]
[HttpGet]
[Route("api/getusers/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}
like others
[Route("api/getcities/{id}")]

或者您可以在文件中指定

       config.Routes.MapHttpRoute(
        name: "users",
        routeTemplate: "api/getusers/{id}",
        defaults: new { action = "GetUser", controller = "Users" }
        );

这样你可以指定其他人


2
投票

IMO,最简单的方法是使用属性路由来做到这一点。 在每个方法前面添加路由参数,您可以在其中指定方法路由。

// GET api/User/5
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);

    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
    var item = repository.GetCities(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

0
投票

最简单的方法,更新 webapiconfig 文件。

// GET api/User/5
[HttpGet]    
[ResponseType(typeof(UserModel))]
[Route("api/User/{id}")]
public IHttpActionResult GetUser(Guid id)
{
    var item = repository.Get(id);    
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

// GET api/User/GetCities/5
[ResponseType(typeof(CityModel))]
[Route("api/User/GetCities/{id}")]
public IHttpActionResult GetCities(int id)
{
    var item = repository.GetCities(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    else
    {
        return Ok(item);
    }
}

您还必须将其分配到 Area API 文件夹 ApiAreaRegistration.cs 文件中

context.Routes.MapHttpRoute(
"Api_default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { area = "Api", id = RouteParameter.Optional }
);

这样,你得根据你的项目分配


-1
投票

下面是我的 WebApi 路由配置

 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Controllers with Actions
        // To handle routes like `/api/VTRouting/route`
        config.Routes.MapHttpRoute(
            name: "DefaultApiwithActionID",
            routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional } 
        );
    }

下面是我的 API 控制器

       // GET api/User/5
    [ResponseType(typeof(UserModel))]
    [Route("api/UserApi/GetUser")]
    public IHttpActionResult GetUser(Guid id)
    {
        var item = repository.Get(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/5
    [ResponseType(typeof(TanentDocumentsModel))]
    [Route("api/UserApi/GetUserDocuments")]
    public IHttpActionResult GetUserDocuments(Guid id)
    {
        var item = repository.GetUserDocuments(id);

        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(CityModel))]
    [Route("api/UserApi/GetCities")]
    public IHttpActionResult GetCities(int id)
    {
        var item = repository.GetCities(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }

    // GET api/User/GetCities/5
    [ResponseType(typeof(StateModel))]
    [Route("api/UserApi/GetStates")]
    public IHttpActionResult GetStates(int id)
    {
        var item = repository.GetStates(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        else
        {
            return Ok(item);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.