是否可以使用如下路线:
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 }
);
答案 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。