修改访问我的api的url

时间:2016-02-01 16:57:15

标签: asp.net-web-api2

我刚刚为本地项目创建了我的第一个api,但我遇到了另一个条款。

目前可以访问我的api,例如/api/{StartDate}/{EndDate}

因此可以导航它,例如www.site.com/details/201001010000/201601010000

但是,现在我需要/api/details?StartDate={startDate}&EndDate={endDate}

目前我的代码是:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{StartDate}/{EndDate}",
    defaults: new { StartDate = RouteParameter.Optional, EndDate = RouteParameter.Optional }
);

[HttpGet]
[Route("")]
[Route("{StartDate}/{EndDate}")]
[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
    DateTime StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
    DateTime EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);

    IEnumerable<ConvertedDetails> detail = db.Details.Where(a => a.callDate >= StartDateTime && a.callDate <= EndDateTime).RestOfLongQuery;

    if (detail.Any())
    {
        return Ok(ResponseTrue);
    }
    return Ok(ResponseFalse);
}

1 个答案:

答案 0 :(得分:1)

问题在于如何在操作上映射HTTP属性路由和Route属性。您可以使用默认的http路由来解决此问题,这会阻止StartDateEndDate成为URL的一部分而不是参数:

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

您也不需要控制器上的Route属性,因此它看起来像这样:

[HttpGet]
[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
    DateTime StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
    DateTime EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);

    IEnumerable<ConvertedDetails> detail = db.Details.Where(a => a.callDate >= StartDateTime && a.callDate <= EndDateTime).RestOfLongQuery;

    if (detail.Any())
    {
        return Ok(ResponseTrue);
    }
    return Ok(ResponseFalse);
}

这样您就可以使用以下URL访问操作: www.site.com/api/details?StartDate=201001010000&EndDate=201601010000