我正在尝试查看是否需要编写自定义IHttpRouteConstraint
,或者我是否可以与内置版本进行搏斗以获得我想要的内容。我无法在任何地方找到任何好的文档。
基本上,这是我的行动:
[Route("var/{varId:int:min(1)}/slot/{*slot:datetime}")]
public async Task<HttpResponseMessage> Put(int varId, DateTime slot)
{
...
}
我想要的是能够像这样调用它:
PUT /api/data/var/1/slot/2012/01/01/131516
并将框架绑定19到var id和DateTime
,其值为“Jan 1st,2012,1:15:16 pm”作为“slot”值。
按照此处的指南进行操作:http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing我可以通过仅传递日期段(即PUT /api/data/var/1/slot/2012/01/01
或PUT /api/data/var/1/slot/2012-01-01
)来使其工作,但这只能为我提供数据价值,没有时间成分。
有些东西告诉我,尝试通过URI段以任何理智的方式传递时间是一个坏主意,但我不确定为什么它是一个坏主意,除了本地与UTC时间的模糊性。
我还尝试用正则表达式约束datetime
约束,例如{slot:datetime:regex(\\d{4}/\\d{2}/\\d{2})/\\d{4})}
尝试将其解析为2013/01/01/151617
之类的日期时间,但无济于事。
我很确定我可以使用自定义IHttpRouteConstraint
进行此操作,我只是不想做可能内置的操作。
谢谢!
答案 0 :(得分:3)
Web API日期时间约束在解析日期时间方面没有做任何特别的事情,您可以在下面看到(源代码here)。
如果您的请求网址类似于var/1/slot/2012-01-01 1:45:30 PM
或var/1/slot/2012/01/01 1:45:30 PM
,那么它似乎工作正常......但我想如果您需要充分的灵活性,那么创建自定义约束是最佳选择...
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
if (parameterName == null)
{
throw Error.ArgumentNull("parameterName");
}
if (values == null)
{
throw Error.ArgumentNull("values");
}
object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
if (value is DateTime)
{
return true;
}
DateTime result;
string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
return DateTime.TryParse(valueString, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
}
return false;
}
答案 1 :(得分:3)
一个选项是将DateTime作为查询字符串参数传递(参见[FromUri]
e.g。
[Route("api/Customer/{customerId}/Calls/")]
public List<CallDto> GetCalls(int customerId, [FromUri]DateTime start, [FromUri]DateTime end)
这将有
的签名GET api/Customer/{customerId}/Calls?start={start}&end={end}
使用
创建查询字符串日期startDate.ToString("s", CultureInfo.InvariantCulture);
查询字符串看起来像
api/Customer/81/Calls?start=2014-07-25T00:00:00&end=2014-07-26T00:00:00