首页 > 其他分享 >OData WebAPI实践-兼容OData集合响应

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

时间:2023-05-15 14:11:22浏览次数:42  
标签:WebAPI 返回 key OData 兼容 API context avg

本文属于 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 的值获取数组对象。

标签:WebAPI,返回,key,OData,兼容,API,context,avg
From: https://www.cnblogs.com/podolski/p/17401695.html

相关文章

  • 宝兰德应用服务器软件与华为云GaussDB完成兼容互认证
    摘要:北京宝兰德软件股份有限公司携手华为云完成宝兰德应用服务器软件9.5与GaussDB数据库兼容性测试,并获得华为云授予的技术认证书。本文分享自华为云社区《宝兰德应用服务器软件与华为云GaussDB完成兼容互认证》,作者:GaussDB数据库。近日,北京宝兰德软件股份有限公司(简称:宝兰德)携......
  • EntityFramework Core 6.0 MySql WebApi
    Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySqlMicrosoft.EntityFrameworkCore.Tools-----------------------------------------------------------------------------------------------------------------------......
  • c# 调用webapi的几种方式
     HttpHelper帮助类publicstaticclassHttphelper{//Post请求publicstaticstringPostResponse(stringurl,stringpostData,outstringstatusCode){stringresult=string.Empty;//设置Http的正文......
  • 【兼容性】Chrome浏览器模拟设置不同分辨率
    1、起因有时候软件系统UI的分辨率有特殊的要求(手机端的,或者是大屏幕显示器),通过浏览器查看的时候,需要设置相同的分辨率。查看页面是否布局不符合要求 2、设置方法点击浏览器右侧三个点-》更多工具-》开发者工具,或者F12直接打开点击右上角设置 点击设备 点击添加自定......
  • 高亮显示字符。兼容大小写,特殊字符
    一个兼容大小写,特殊字符的高亮显示函数functionhighlight(str,char){constescapedChar=char.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');if(str.toLowerCase().includes(char.toLowerCase())){returnstr.replace(newRegExp(escapedChar,'gi'......
  • OData WebAPI实践-OData与EDM
    本文属于OData系列引言在OData中,EDM(EntityDataModel)代表“实体数据模型”,它是一种用于表示WebAPI中的结构化数据的格式。EDM定义了可以由OData服务公开的数据类型、实体和关系。EDM也提供了一些规则来描述数据模型中的实体之间的关系,例如继承、关联和复合类型。E......
  • 跳转页面input输入框自动聚焦,兼容安卓和ios
    需求是这样:点击某个页面或某个页面的模块,跳转到带搜索的子页面,并且自动弹出手机软键盘。长话短说,代码://封装一个自动聚焦的函数,兼容ios和安卓constautofocusFn=()=>{constdoc=documentconstinput=doc.querySelector('#hide-focus-input')letdom=null......
  • 解决webgl使用canvas.toDataURL()没有内容的问题
    这个问题很好解决,就是在获取webgl对象的时候,多传入一个​​{preserveDrawingBuffer:true}​​​,然后在使用​​canvas.toDataURL()​​​获取就能够获取到了。案例:varcanvas=document.getElementById("canvas");vargl=canvas.getContext("webgl",{preserveDrawingBuf......
  • Node16+版本出现node-sass兼容性问题
    最近多次遇到这个问题,node16+版本安装或者初始化带有node-sass和sass-loader包的项目报错。翻遍了所有相关文章,总结出以下两种解决办法:方法一:卸载旧版本的node-sass和sass-loader,安装sass和sass-loader,不再使用node-sassnpmuninstallsass-loadernode-sassnpminstallsass-l......
  • 移动端兼容问题汇总
    序号机型/系统问题描述解决方案    1IOS正则表达式导致的iOS进入页面白屏问题因为iOS不支持正则的零宽断言,改成字符串切割或者其他替代方案即可2IOSIOS时间格式问题IOS的newDate日期格式不能使用YYYY-MM-DD,必须使用newDate("YYYY/MM/DD")。(第......