OData WebAPI实践-兼容OData集合响应

这篇具有很好参考价值的文章主要介绍了OData WebAPI实践-兼容OData集合响应。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文属于 OData 系列文章

引言

OData 是一个开放标准,已经在 oasis 组织标准化,因此我们可以在标准的官网查询到 OData 的标准请求与返回形式:OData JSON Format Version 4.01 (oasis-open.org)

针对不同的数据类型,输出返回的格式也不尽相同,涉及的内容非常多。日常使用 OData 的过程中,我们经常处理的是实体对象以及实体对象的集合。如果直接返回 IQueryable 用于 OData 查询,那么返回的数据大多是集合(数组/列表)。

{
    "@odata.context": "http://localhost:9000/api/v2/$metadata#Collection(Datum_AggDto)",
    "@odata.count": 2,
    "value": [
        {
            "timestamp": 1682294400000,
            "max": 180.0,
            "min": 152.0,
            "avg": 161.7605633802817
        },
        {
            "timestamp": 1682985600000,
            "max": 281.0,
            "min": 180.0,
            "avg": 228.39583333333334
        }]
}

这个数组对象也不是很纯粹,它被 value 封装,并且提供了 @odata.context 元数据链接。如果我们的 API 没有被 OData 路由解析,那么默认 WEBAPI 会返回一个纯粹的数组对象:

[
{
	"timestamp": 1682294400000,
	"max": 180.0,
	"min": 152.0,
	"avg": 161.7605633802817
},
{
	"timestamp": 1682985600000,
	"max": 281.0,
	"min": 180.0,
	"avg": 228.39583333333334
}]

假设我们的对外的数据接口不完全被 OData 路由,会导致前端访问的行为不一致:一些 API 可以直接解析,另外一些 API 则需要使用 value 封装后处理。

封装非 OData Route Mapping

由于 OData 有了标准,为了对外保持一致性,我们可以尝试在返回非 OData 路由 API 时,将原始数组对象进行封装。

单实体对象

        [HttpGet("/api/v1/Current")]
        [ProducesResponseType(typeof(DeviceDataDto), Status200OK)]
        public IActionResult Current(string key)
        {
            key = key.Trim('\'');
            var data = _context.DeviceData.Where(w => w.DeviceId == key).OrderByDescending(w => w.Timestamp).FirstOrDefault();

            return Ok(_mapper.Map<DeviceDataDto>(datas));
        }

对于以上的代码,只返回单个实体对象,返回的形式与 OData 标准中返回单个实体对象的标准一致,因此不需要额外的转换操作。

{
	//OData 返回会多一个context,普通API不会有。
	"@odata.context": "http://localhost:9000/api/v2/$metadata#Datum_AggDto",
	"timestamp": 1682985600000,
	"max": 281.0,
	"min": 180.0,
	"avg": 228.39583333333334
}

实体对象集合

        [HttpGet("/api/v1")]
        [ProducesResponseType(typeof(IEnumerable<DeviceDataDto>), Status200OK)]
        public async Task<IActionResult> Get(string key)
        {
            key = key.Trim('\'');
            return Ok(await _context.DeviceData.Where(w => w.DeviceId == key).ToListAsync());
        }

以上代码返回的类型是一个集合,并且被 OData 路由映射。我们使用 value 这个 key 对齐进行封装:

        [HttpGet("/api/v1")]
        [ProducesResponseType(typeof(IEnumerable<DeviceDataDto>), Status200OK)]
        public async Task<IActionResult> Get(string key)
        {
            key = key.Trim('\'');
            var datas = await _context.DeviceData.Where(w => w.DeviceId == key).ToListAsync();

            var result = new { Value = datas };
            return Ok(result);
        }

注意这个 Value 我使用的是大写,由于我启用了 camelCase,所以会自动转换为小写。这样前端访问 API 时,不论是否为 OData API 都可以访问 value 的值获取数组对象。文章来源地址https://www.toymoban.com/news/detail-445308.html

到了这里,关于OData WebAPI实践-兼容OData集合响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包