Web Api GET参数

时间:2017-09-26 19:44:41

标签: c# asp.net-web-api

是否可以使用如下路线:

  

MyApi / v1 / Events //从db

获取所有事件      

MyApi / v1 / Events?经度= 4.4777& Latitude = 51.9244 //获取特定位置的请求

在我的代码中,我使用基于属性的路由和路由前缀:

    [Route("")]
    // GET: MyApi/v1/Events
    public IEnumerable<EventDto> Get()
    {
        return EventService.GetAllEvents().ToDto();
    }

    [Route("{Latitude}/{Longitude}/{Radius}")]
    // GET: MyApi/v1/Events?Latitude={doubleVal}&Longitude={doubleVal}
    public IEnumerable<EventDto> Get(double? Latitude, double? Longitude, double? Radius)
    {
        return EventService.ReadEvent(Latitude.Value, Longitude.Value, Radius.Value).ToDto();
    }

另外,我在控制器上使用路由前缀:

[RoutePrefix(WebApiConfig.ClientAppName + "/v1/Events")]

似乎只触发了我的api的Get all而不是参数版本。我尝试了Route属性的不同变体但没有成功。 在我的WebApiConfig中:

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

2 个答案:

答案 0 :(得分:1)

您的参数化方法需要路由MyApi/v1/Events/{Latitude}/{Longitude}/{radius}(即参数值在路径本身中),但您使用查询字符串参数的请求映射到路由MyApi/v1/Events

将请求格式化为包含路径中的参数,或者将参数包含在默认Get()操作方法中,并使用null默认值,并根据以下内容确定要调用的EventService方法存在这些参数的值。

答案 1 :(得分:1)

显然,您希望探索 ASP.NET Web API 2 属性路由的机会,以支持RESTful API中常见的某些URI模式。

现在称为convention-based routing甚至支持您的特定用例,以使API客户端能够根据纬度,经度和半径查询事件资源集合。

  

的https:// {base_uri} /MyApi/v1/Events?Longitude=4.4777&Latitude=51.9244

public EventsController : ApiController
{
    public IEnumerable<EventDto> GetEvents([FromUri] double? latitude, [FromUri] double? longitude) 
    {             
        //code validating method parameters

        return EventService.ReadEvent(Latitude.Value, Longitude.Value).ToDto()  
    }
}

在动作参数上使用 [FromUri] 属性称为"Parameter binding"。如果要强制ASP.NET Web API从URI读取复杂类型,则参数绑定非常有用。您的应用程序涉及事件和地理空间问题,并将这些问题封装到复杂类型中,因为您已经使用事件帮助记录任何接口约束。当只提供经度值时,查询事件的含义是什么?鉴于省略 nullable 参数有助于您的特定用例。

以下示例定义了GeoPoint类型,以及从URI获取GeoPoint的控制器方法。

public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

public EventsController : ApiController
{
    //action is only selected when URI contains required parameters to bind a GeoPoint instance
    public IEnumerable<EventDto> GetEvents([FromUri] GeoPoint geoPoint)
    {
        //how about passing a complex type to the EventService?
        return EventService.ReadEvent(geoPoint).ToDto()  
    }
}

返回给定距离/半径内的事件集合的URI可能类似于

  

的https:// {base_uri} /MyApi/v1/Events?Longitude=4.4777&Latitude=51.9244&Radius=10.000

public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

public class GeoPointQuery
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
    public double Radius {get; set; }
}

public EventsController : ApiController
{
    public IEnumerable<EventDto> GetEvents([FromUri] GeoPoint geoPoint)
    {
        //how about passing a complex type to the EventService?
        return EventService.GetEventAtPoint(geoPoint).ToDto()  
    }

    public IEnumerable<EventDto> GetEventsQuery([FromUri] GeoPointQuery geoPointQuery)
    {
        //how about passing a complex type to the EventService?
        return EventService.GetEventsWithinDistance(geoPointQuery).ToDto()  
    }
}

应用Attribute routing将帮助您解决更多分层URI模式,并具有强大的语言来定义route constraints