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 的值获取数组对象。
OData WebAPI实践-兼容OData集合响应的更多相关文章
- [转]OData/WebApi
本文转自:https://github.com/OData/WebApi/tree/vNext OData Web API Introduction OData Web API (i.e., ASP. ...
- [转]OData的初步认识 OData v4 Client Code Generator
本文转自:http://www.cnblogs.com/1zhk/p/5356053.html What – OData是什么? OData - Open Data Protocol,是一个设计和使用 ...
- .net core 杂记:WebAPI的XML请求和响应
一般情况下,restfult api 进行数据返回或模型绑定,默认json格式会比较常见和方便,当然偶尔也会需要以XML格式的要求 对于返回XML,普通常见的方式就是在每个aciton方法进行诸如X ...
- [整理]WebAPI中应用oData
http://www.odata.org/ http://bitoftech.net/category/odata/ http://www.hanselman.com/blog/CreatingAnO ...
- 快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~
Odata是什么? 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准.该标准由微软发起,前三个版本1.0.2.0.3.0都 ...
- 写给新手的WebAPI实践
此篇是写给新手的Demo,用于参考和借鉴,用于发散思路.老鸟可以忽略了. 自己经常有这种情况,遇到一个新东西或难题,在了解和解决之前总是说“等搞定了一定要写篇文章记录下来”,但是当掌握了之后,就感觉好 ...
- Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统
最近正在学习Vue2.0相关知识,正好近期饿了么桌面端组件Element-UI发布,便动手做了一款简易个人记账系统,以达到实践及巩固目的. 1.开发环境 Win10 + VS2015 + Sqlser ...
- webApi实践:开始WebApi 2
1.学习步骤总结 学习网址:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-you ...
- [转]How to Use Web API OData to Build an OData V4 Service without Entity Framework
本文转自:http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity- ...
- videojs实践--兼容ie7,8
1,还是先上图 ie9+,ff,chrome,,,
随机推荐
- 图像主题颜色提取(Median cut)
前言 之前想对图片素材进行分类管理,除了打标签,还有一样是通过主题色进行分类.于是开始寻找能提取主主题色的工具,最后找到了大名鼎鼎的 Leptonica 库,其中就有中位切割算法的实现.下面附上中位切 ...
- Less-4 报错注入
补坑:报错注入 当我们 union 无法注入的时候,可以使用报错注入,这里我们有三种报错注入,xpth语法错误和count()+rand()+floor()+group by重复组建错误 extrac ...
- 三天吃透MySQL面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- Javaweb学习笔记第十四弹---对于Cookie和Filter的学习
Apache Tomcat - Tomcat Native Downloads 会话追踪技术 会话:打开浏览器,建立连接,直到一方断开连接,会话才会结束:在一次会议中,可以有多次请求. 会话追踪:在多 ...
- c++的thread小测试
windows环境还用不了thread,得下一些mingw,弄了半天没弄好,直接用了商店中心就有的Ubuntu了,但是sudo install g++出现了下载不了的问题,解决方案:https://b ...
- 玩转SpringBoot原理:掌握核心技术,成为高级开发者
本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件 步骤一:创建项目 步骤二:添加依赖 步骤三:创建自动配置类 步骤四:创建 ...
- 基于DPDK抓包的Suricata安装部署
一.背景 Suricata支持网卡在线抓包和离线读取PCAP包两种形式的抓包: 离线抓包天然具有速度慢.非实时的特点 在线捕获数据包又包括常规网卡抓包.PF_RING和DPDK的方式 由于项目分光的流 ...
- OpenAI Kubernetes 相关博文读后笔记
一.概述 最近 ChatGPT 和其公司 OpenAI 特别火:ChatGPT 3, ChatGPT 3.5, New Bing, ChatGPT 4... 怀着学习的心态,这几天访问了 OpenAI ...
- 为什么wait()需要在同步代码块内使用
我们还是通过源代码和代码注释来学习这个问题 我们先来看看wait方法的注释,这里截取最根源的native方法给的注释 Causes the current thread to wait until e ...
- Centos7安装配置MySQL 5.6
Centos7安装配置MySql 5.6 首先下载MySql5.6的安装包,具体安装方式分为yum安装与离线安装.在新版本的CentOS7中,默认的数据库已更新为了Mariadb,而非 MySQL. ...