Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DateTime的通用终结点还是三个不同的终结点?_C#_Asp.net Core_Azure Cosmosdb - Fatal编程技术网

C# DateTime的通用终结点还是三个不同的终结点?

C# DateTime的通用终结点还是三个不同的终结点?,c#,asp.net-core,azure-cosmosdb,C#,Asp.net Core,Azure Cosmosdb,我有一个问题,因为我以前遇到过这种情况,我想知道最佳实践 假设您需要这三个端点 host:port/api/movies/published/2012返回“2012”中按发布日期排序的所有内容(M13,M1) host:port/api/movies/published/2012/8返回“2012-08”中按发布日期(M1)排序的所有内容 host:port/api/movies/published/2012/8/15返回“2012-08-15”中按发布日期(M1)排序的所有内容 您是否会这样做

我有一个问题,因为我以前遇到过这种情况,我想知道最佳实践

假设您需要这三个端点

host:port/api/movies/published/2012
返回“2012”中按发布日期排序的所有内容(M13,M1)
host:port/api/movies/published/2012/8
返回“2012-08”中按发布日期(M1)排序的所有内容
host:port/api/movies/published/2012/8/15
返回“2012-08-15”中按发布日期(M1)排序的所有内容

您是否会这样做一个通用端点,或者在这些情况下,什么是最佳实践?你将如何解决它

[HttpGet("published/{year:int}/{month:int?}/{day:int?}/")]
public void GetMoviesSortedByPublishedDateAsync(int year, int month = 0, int day = 0)
{

    if (month == 0)
    {
        var date = new DateTime(year, 1, 1);
        await _cosmosDbService.GetMoviesByYear(date.Year);
    }
    else if(day == 0)
    {
        var date = new DateTime(year, month, 1);
        await _cosmosDbService.GetMoviesByYearAndMonth(date.Year, date.Month);
    }
    else
    {
        var date = new DateTime(year, month, day);
        await _cosmosDbService.GetMoviesByPublishedDate(date);
    }
}
您是否会这样做一个通用端点,或者在这些情况下,什么是最佳实践

我认为应该根据API的使用方式做出决定。这个API的使用者很可能会有一个类似的过滤选项(按年、按月、按日期),在这种情况下,使用单个端点会更好


就最佳实践而言,以下是支持您的方法的示例—请查看“允许筛选、排序和分页”部分。

为什么不将其简化为:

[HttpGet("published/{year:int}/{month:int?}/{day:int?}/")]
public void GetMoviesSortedByPublishedDateAsync(int year, int month = 1, int day = 1)
{
    var date = new DateTime(year, month, day);
    await _cosmosDbService.GetMoviesByPublishedDate(date);
}
您的搜索可以是特定的,如果他们不提供月份,这其实并不重要,因为您将从给定年份的开始进行搜索(当天也是如此)


您最终得到的代码更少,也更简单。

您所拥有的可能有用,但它确实有一些可能的缺点,包括在URL路径中构建参数最终会创建无限多的可能路径。如果您想分析或过滤流量日志,或者进行其他请求处理,解析这些路径组合可能会带来一些麻烦

将日期作为查询字符串中的一个参数似乎是一种更好的做法,因为更多的URL也是如此。它可以是中的日期前缀,这自然是可排序的。然后,您的查询可以利用Cosmos DB中的本机功能,对
publishedDate
属性进行高效过滤和排序

它可能看起来像这样:

[HttpGet("{published}")]
public void GetMoviesSortedByPublishedDateAsync(string published)
{
    if(!string.IsNullOrEmpty(published) // Validate better than this :)
    {
        // Queries container where published date STARTSWITH specified value
        await _cosmosDbService.GetMoviesByPublishPrefix(published);
    }
}
可能的值可以是任意有效的日期前缀,可选的日期/月份为2位:

2020 => GET https://app.com/movies?published=2020
2020-03 => GET https://app.com/movies?published=2020-03
2020-03-13 => GET https://app.com/movies?published=2020-03-01

老实说,您的代码看起来是一种足够体面的方法。它不起作用吗?你为什么需要这三个?第一个应该付出一切。所以你们的解决方案是给两份和三份。您可以从第一次查询得到所有信息。然后在八月份你会得到所有的复制品。然后在8月15日对所有内容进行三次复制。我的意思是,是的,它应该有效,但有没有更好、更有效的方法来解决它?如果他们提供日和年呢?@mjwills公平的问题,但是,在api上如何称呼它<代码>http://.../year/(null?/2:耸耸肩:可能吗?我认为这完全取决于
GetMoviesByPublishedDate
的实现方式。从这个问题来看,我认为这个方法只会返回特定日期的数据。因此,使用此解决方案,我希望只提供2012年的请求只返回2102-01-01的数据,而不是2012@devNull是的..英语很有趣..
返回所有来源
可以建议从给定日期开始,或者从该日期开始,我最终使用了这个解决方案,但它只有在我使用published=2020-03时才有效,但如果用户发送它时像published=2020-3一样,没有零。然后STARTSWITH不会返回对象。是的,如果需要,您需要确保输入被填充: