如何将UTC日期传递给Web API?
传递< code>2010-01-01可以正常工作,但是当我传递一个UTC日期,如< code > 2014-12-31t 22:00:00 . 000 z (带有时间部分)时,我得到一个HTTP 404响应。因此
http://domain/api/controller/action/2012-12-31T22:00:00.000Z
产生 404 错误响应,而
http://domain/api/controller/action/2012-12-31
工作正常。
如何将UTC日期传递给Web API,或者至少指定日期和时间?
我感受到你的痛苦...又一种日期时间格式...正是你需要的!
使用Web Api 2,您可以使用路由属性指定参数。
因此,通过类和方法上的属性,您可以使用这种有问题的utc格式(显然是它的ISO8601,大概是使用startDate.toISOString()得到的)编写一个REST URL
[Route(@"daterange/{startDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}/{endDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}")]
[HttpGet]
public IEnumerable<MyRecordType> GetByDateRange(DateTime startDate, DateTime endDate)
....但是,尽管这适用于一个日期(开始日期),但由于某种原因,当结束日期采用这种格式时,它就不起作用了...调试了几个小时,唯一的线索是异常说它不喜欢冒号“:”(即使web.config设置为:
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>
因此,让我们制作另一种日期格式(取自ISO日期格式的polyfill ),并将其添加到Javascript日期中(为简洁起见,最多只转换到分钟):
if (!Date.prototype.toUTCDateTimeDigits) {
(function () {
function pad(number) {
if (number < 10) {
return '0' + number;
}
return number;
}
Date.prototype.toUTCDateTimeDigits = function () {
return this.getUTCFullYear() +
pad(this.getUTCMonth() + 1) +
pad(this.getUTCDate()) +
'T' +
pad(this.getUTCHours()) +
pad(this.getUTCMinutes()) +
'Z';
};
}());
}
然后,当您将日期发送到Web API 2方法时,可以将其从字符串转换为日期:
[RoutePrefix("api/myrecordtype")]
public class MyRecordTypeController : ApiController
{
[Route(@"daterange/{startDateString}/{endDateString}")]
[HttpGet]
public IEnumerable<MyRecordType> GetByDateRange([FromUri]string startDateString, [FromUri]string endDateString)
{
var startDate = BuildDateTimeFromYAFormat(startDateString);
var endDate = BuildDateTimeFromYAFormat(endDateString);
...
}
/// <summary>
/// Convert a UTC Date String of format yyyyMMddThhmmZ into a Local Date
/// </summary>
/// <param name="dateString"></param>
/// <returns></returns>
private DateTime BuildDateTimeFromYAFormat(string dateString)
{
Regex r = new Regex(@"^\d{4}\d{2}\d{2}T\d{2}\d{2}Z$");
if (!r.IsMatch(dateString))
{
throw new FormatException(
string.Format("{0} is not the correct format. Should be yyyyMMddThhmmZ", dateString));
}
DateTime dt = DateTime.ParseExact(dateString, "yyyyMMddThhmmZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
return dt;
}
所以url应该是
http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z
Hanselman在这里给出了一些相关信息:
http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
在您的产品 Web API 控制器中:
[RoutePrefix("api/product")]
public class ProductController : ApiController
{
private readonly IProductRepository _repository;
public ProductController(IProductRepository repository)
{
this._repository = repository;
}
[HttpGet, Route("orders")]
public async Task<IHttpActionResult> GetProductPeriodOrders(string productCode, DateTime dateStart, DateTime dateEnd)
{
try
{
IList<Order> orders = await _repository.GetPeriodOrdersAsync(productCode, dateStart.ToUniversalTime(), dateEnd.ToUniversalTime());
return Ok(orders);
}
catch(Exception ex)
{
return NotFound();
}
}
}
在Fiddler - Composer中测试GetProductPeriodOrders方法:
http://localhost:46017/api/product/orders?productCode=100&dateStart=2016-12-01T00:00:00&dateEnd=2016-12-31T23:59:59
日期时间格式:
yyyy-MM-ddTHH:mm:ss
javascript pass 参数使用时刻.js
const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');
问题是双重的:
默认情况下,IIS将所有带有一个点的URI视为静态资源,尝试返回它并跳过进一步的处理(通过Web API)。这是在您的Web中配置的。在system.webServer一节中进行配置。处理程序
:默认处理程序处理<code>路径=*。关于这个<code>路径</code>属性中奇怪的语法,您不会找到太多文档(正则表达式更有意义),但这显然意味着“任何不包含点的东西”(以及下面第2点中的任何字符)。因此,ExtensionlessUrlHandler-Integrated-4.0
名称中的“无扩展”。
在我看来,多种解决方案是可能的,按“正确性”的顺序排列:
path=“*”
属性更改为path=“*”
。然后它会抓住一切。请注意,从那时起,您的web api将不再将带有点的传入调用解释为静态资源!如果您在web api上托管静态资源,则不建议这样做更改上述内容后,默认情况下,您会得到以下错误:
一个潜在危险的请求。从客户端检测到路径值(:)。
您可以在Web.config中更改预定义的不允许/无效字符。在下
虽然不是您问题的答案,但更安全、更简单的解决方案是更改请求,这样就不需要所有这些了。这可以通过两种方式完成:
将日期作为查询字符串参数传递,如? date=2012-12-31T22:00:00.000Z
。
- 从每个请求中删除
.000
。您仍然需要允许:
s(cfr point 2)。
我在一个spring MVC项目和spring tools套件中工作,我想把一个日期参数传递给一个原生查询,到目前为止我已经有了这个。 扩展JpaRepository的接口中的查询方法
我在derby数据库上有一个带有日期参数的报告,当通过两个文本字段发送日期以运行i时,我收到了下面的消息,得到了下面的报价错误消息。 线程“AWT-EventQueue-0”中出现异常Java . lang . classcastexception:Java . lang . string不能转换为net . SF . jasperreports . engine . query . jrjdbc
问题内容: 在SQL语句中,如何比较保存为TIMESTAMP的日期和YYYY-MM-DD格式的日期? 例如: 我希望此查询返回指定日期中所有带有时间戳的行,但它仅返回具有午夜时间戳的行。 谢谢 问题答案: 您可以使用该函数提取时间戳记的日期部分: 但是,如果您在timestamp列上有索引,则这样做会更快,因为它可以利用索引:
问题内容: 我正在尝试创建以start_date和end_date为参数的 JR 报告。 查询: 代码: 我们可以将两个参数传递到表中的同一列吗?例如: 问题答案: 您的代码是错误的。 您应该传递如下参数: 您无需添加 到参数名称。 JasperReports 分发包中有很多示例。 您可以查看此样本以获取更多详细信息。
问题内容: 您如何使用jquery和mvc3将日期时间(我需要第二个)传递给c#。这就是我所拥有的 我无法弄清楚日期应采用哪种格式,以便C#理解。 问题答案: 以下格式应该可以工作:
问题内容: 我有一个日期时间格式的字段,当日期更好并且与数据库的其余部分更一致时,我想进行转换。无论如何,时间部分都是00:00:00。 如何在MySQL中做到这一点? 谢谢。 问题答案: 如果要在-Statement中使用,请使用运算符: 如果要在结构上更改表,只需将数据类型更改为(当然,只有在不影响依赖于此字段的应用程序的情况下,才这样做)。 两者都将消除时间部分。