码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OData WebAPI实践-兼容OData集合响应


    合集 - OData(13)
    1.武装你的WEBAPI-OData入门2020-05-122.武装你的WEBAPI-OData便捷查询2020-05-133.武装你的WEBAPI-OData分页查询2020-05-184.武装你的WEBAPI-OData资源更新Delta2020-07-075.武装你的WEBAPI-OData使用Endpoint05-096.武装你的WEBAPI-OData之API版本管理05-057.武装你的WEBAPI-OData常见问题2021-02-028.武装你的WEBAPI-OData聚合查询03-279.武装你的WEBAPI-OData与DTO05-0810.OData WebAPI实践-OData与EDM05-1111.OData WebAPI实践-Non-EDM模式05-12
    12.OData WebAPI实践-兼容OData集合响应05-15
    13.OData WebAPI实践-与ABP vNext集成05-16
    收起

    本文属于 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(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), Status200OK)]
            public async Task 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), Status200OK)]
            public async Task 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 的值获取数组对象。

  • 相关阅读:
    16 最长回文串
    Jenkins如何安装配置Allure插件及工具
    WebSocket实战之六心跳重连机制
    公司保密协议(中英对照)Confidentiality-Agreement
    FANUC机器人用户自定义报警的具体配置方法详解
    Linux C/C++ 学习笔记(八):实现http客户端请求
    计算机毕业设计Python+djang的新生报到服务管理系统(源码+系统+mysql数据库+Lw文档)
    Programming Differential Privacy第八章
    【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(二)
    聊聊 mysql 事务?(一)
  • 原文地址:https://www.cnblogs.com/podolski/p/17401695.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号