• OData – Routing


    前言

    以前我都是把 ODataController 和普通 API Controller 分开做. (因为 OData 实在多 Bug, 好东西尽量不要掺和它)

    Read 的部分用 OData, CUD 的部分就用原本的 API. 

    但最近 OData 弃用了 ODataRoute 这些东西, 改用 Web API 的 Route, HttpGet 等.

    视乎它有心把大家统一起来, 所以我去了解了一下.

    主要参考

    Routing in ASP.NET Core OData 8.0 Preview

    Attribute Routing in ASP.NET Core OData 8.0 RC

    By Default

    在没有设置 Attribute 的情况下. 当我们定义一个 Entity 以后. 它就有了它的路径

    builder.EntitySet<Product>("Products");

    比如

    GET products

    GET products/$count

    GET products/{key}

    GET products({key})

    这个叫 template, 一般上我们是不会去修改它的. 改了就不像 restful 了嘛. 

    Controller 要对上这些路径, 就要有一套标准写法

    有一点点写不对就匹配不上了

    Attribute route

    Web API 的 attribute route 可以让我们任意 match url 然后带去 action. 

    OData attribute route 只是取代了上面那种通过 Controller 命名去 match 的方式. 

    它并不能任意写 url 哦, 你还是得按照 OData 规定得 restful template 去写匹配

    在使用 attribute route 之后, controller, action, parameter 的命名就可以任意了. 

    但要记得哦, 它不能任意写 path, 一定要写 odata restful template 定义好的, 除非你自己去 override route conversion.

     

    和 WebAPI share 同一个 Controller

    我不知道这个是不是一个好的 way 啦. 但至少分开 Controller 对 swagger 会是一个问题啦 (它是以 Controller 分 group 的)

    首先不要继承 ODataController 

    它里面其实也只是有 created 和 updated 的东西而已, 而我刚好只用它做 query. perfect !

    没有 ODataController 以后 attribute route 就不 working 了

    需要另外加上 [ODataAttributeRouting]

    [ODataAttributeRouting]
    public class HandleCustomerController : Controller
    {
    …
    }

    或者

    [ODataAttributeRouting]
    [HttpGet("odata/Orders/{key}")]
    public IActionResult Get(int key)
    {
        return Ok($"Orders{key} from OData");
    }

    如果只是 action 有, controller 没有, 但是它也会去 parent 拿到 api 哦. 很聪明一下

     
  • 相关阅读:
    Nginx安装
    node.js搭建vue脚手架
    Oracle引入数据
    MVC引入Junit单元测试
    Git版本控制器
    IDEA-Maven
    SSM框架整合
    【测试基础第五篇】测试用例编写和评审
    【测试基础第四篇】测试用例设计方法
    【测试基础第三篇】需求测试分析
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15459057.html
Copyright © 2020-2023  润新知