基于上一篇《创建基于OData的Web API - Knowledge Builder API, Part III:Write Model and Controller》,新创建的OData Service已经能够正常显示metadata和读所有记录了,但是最基本的创建,读取单个,修改单个功能还没有。

本篇就在上一篇的基础上,增强Controller使之能涵盖CRUD的全部功能。

1. 对于Create操作,通常映射到POST方法,在KnowledgesController中加入如下方法

        // POST: /Knowledges
/// <summary>
/// Support for creating knowledge
/// </summary>
public async Task<IActionResult> Post([FromBody] Knowledge knowledge)
{
if (!ModelState.IsValid)
{
foreach (var value in ModelState.Values)
{
foreach(var err in value.Errors)
{
System.Diagnostics.Debug.WriteLine(err.Exception?.Message);
}
} return BadRequest();
} _context.Knowledges.Add(knowledge);
await _context.SaveChangesAsync(); return Created(knowledge);
}

注意,因为创建Knowledge必须保证数据的完整性(Model中使用Annotation),所以这里需要判断ModelState。

在Debug语境下,程序会输出所有错误信息。

2. 对于Update操作,对应于PUT方法,则加入如下方法,

        // PUT: /Knowledges/5
/// <summary>
/// Support for updating Knowledges
/// </summary>
public async Task<IActionResult> Put([FromODataUri] int key, [FromBody] Knowledge update)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
} if (key != update.ID)
{
return BadRequest();
} _context.Entry(update).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!_context.Knowledges.Any(p => p.ID == key))
{
return NotFound();
}
else
{
throw;
}
} return Updated(update);
}

这里省略了与Create操作中一样的错误输出信息。

3. 对于Delete操作,对应于DELETE方法,则加入:

        // DELETE: /Knowledges/5
/// <summary>
/// Support for deleting knowledge by key.
/// </summary>
public async Task<IActionResult> Delete([FromODataUri] int key)
{
var knowledge = await _context.Knowledges.FindAsync(key);
if (knowledge == null)
{
return NotFound();
} _context.Knowledges.Remove(knowledge);
await _context.SaveChangesAsync(); return StatusCode(); // HttpStatusCode.NoContent
}

4. 另外一种Update方法,即HTTP PATCH,

        // PATCH: /Knowleges
/// <summary>
/// Support for partial updates of knowledges
/// </summary>
public async Task<IActionResult> Patch([FromODataUri] int key, [FromBody] Delta<Knowledge> knowledge)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
} var entity = await _context.Knowledges.FindAsync(key);
if (entity == null)
{
return NotFound();
} knowledge.Patch(entity); try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!_context.Knowledges.Any(p => p.ID == key))
{
return NotFound();
}
else
{
throw;
}
} return Updated(entity);
}

5. 单个读,同样对应于HTTP GET操作,不同的是,它需要指定Key。

        /// GET: /Knowledges(:id)
/// <summary>
/// Adds support for getting a knowledge by key, for example:
///
/// GET /Knowledges(1)
/// </summary>
/// <param name="key">The key of the Knowledge required</param>
/// <returns>The Knowledge</returns>
[EnableQuery]
public SingleResult<Knowledge> Get([FromODataUri] int key)
{
return SingleResult.Create(_context.Knowledges.Where(p => p.ID == key));
}

6. 至此,这个Controller已经支持了CRUD操作,可以打开Postman等操作进行测试了。

同时,可以参阅OData官方文档关于Query Data的方法,使用OData强大的数据检索功能进行读取测试。

是为之记。
Alva Chien

2019.11.19

创建基于OData的Web API - Knowledge Builder API, Part IV: Write Controller的更多相关文章

  1. 创建基于OData的Web API - Knowledge Builder API, Part I:Business Scenario

    在.NET Core 刚刚1.0 RC的时候,我就给OData团队创建过Issue让他们支持ASP.NET Core,然而没有任何有意义的答复. Roadmap for ASP.NET Core 1. ...

  2. 创建基于OData的Web API - Knowledge Builder API, Part III:Write Model

    在前两篇文章<Part I: Business Scenario> 和<Part II: Project Setup>后,可以开始真正Model的创建. 步骤如下: 1. 创建 ...

  3. 创建基于OData的Web API - Knowledge Builder API, Part II:Project Setup

    本篇为Part II:Project Setup 查看第一篇<Part I:  Business Scenario> 第一步,准备步骤. 准备步骤一,下载.NET Core 2.2 SDK ...

  4. 使用 node-odata 轻松创建基于 OData 协议的 RESTful API

    前言 OData, 相信身为.NET程序员应该不为陌生, 对于他的实现, 之前也有童鞋进行过介绍(见:这里1,这里2). 微软的WCF Data Service即采用的该协议来进行通信, ASP.NE ...

  5. 基于SVG的web页面图形绘制API介绍

    转自:http://blog.csdn.net/jia20003/article/details/9185449 一:什么是SVG SVG是1999由W3C发布的2D图形描述语言,纯基于XML格式的标 ...

  6. Java Web学习系列——创建基于Maven的Web项目

    创建Maven Web项目 在MyEclipse for Spring中新建Maven项目 选择项目类型,在Artifact Id中选择maven-archetype-webapp 输入Group I ...

  7. 可能是最简单的方式:利用Eclipse创建基于Maven的Web项目

    1. 新建一个maven项目 2.在弹出框中选择创建一个简单项目 3. 然后输入参数,需要注意的是,在packagin中,选择war,web项目应该选择war 4. 点击finish后,基本项目结构就 ...

  8. idea创建基于maven的web项目

    1.点击create new project,选择maven,点击next 2.输入项目信息,点击finish 3.进入项目后,点击菜单File->Project Structure开始配置项目 ...

  9. maven-bundle-plugin插件, 用maven构建基于osgi的web应用

    maven-bundle-plugin 2.4.0以下版本导出META-INF中的内容到MANIFEST.MF中 今天终于把maven-bundle-plugin不能导出META-INF中的内容到Ex ...

随机推荐

  1. 超级好用的 Java 数据可视化库:Tablesaw

    本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和使用 Tablesaw 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出 ...

  2. [NOIp2011] luogu P1314 聪明的质监员

    题目描述 点进去看吧,说的不能再清楚了. Solution 看到数据规模不难想到二分 WWW,然后用个前缀和优化一下即可.注意上下界. #include<cstdio> #include& ...

  3. [Luogu3112] [USACO14DEC]后卫马克Guard Mark

    题意翻译 FJ将飞盘抛向身高为H(1 <= H <= 1,000,000,000)的Mark,但是Mark被N(2 <= N <= 20)头牛包围.牛们可以叠成一个牛塔,如果叠 ...

  4. Python开发【第七篇】列表

    问题:当我们要用一系列数字的时候,我们需要将数字进行存储,我们就需要找个容器把数字装起来,我们需要用的时候再拿出来.如何将计算机运算的数据存储在一个地方,同时方便 对数据进行 增.删.改.查 列表 列 ...

  5. vue —— Toast 内 加变量

    toast正常使用: 在页面内引入: import { Toast } from 'mint-ui' 使用的时候,简单到飞起: Toast('领取成功'); 而如果想在toast中加入变量,也很简单: ...

  6. textView 实现完成收键盘操作

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSStr ...

  7. 关于举办【福州】《K8S社区线下技术交流会》的问卷调查

      近年来,容器.Kubernetes.DevOps.微服务.Serverless等一系列云原生技术受到越来越多的关注,云原生为企业数字化转型提供了创新源动力,基于云原生技术构建企业技术中台在各行业也 ...

  8. Shiro learning - 认证流程(3)

    Shiro认证流程 在学习认证流程之前,你应该先了解Shiro的基本使用流程 认证 身份认证: 证明用户是谁.用户需要提供相关的凭证principals(身份标识)和Credentials (凭证,证 ...

  9. mac本地安装单机hadoop--学习笔记

    Mac配置hadoop1.修改 /etc/hosts127.0.0.1 localhost2.下载hadoop2.9.0和jdk并安装配置相应环境 vim /etc/profile export HA ...

  10. Java11新特性 - Epsilon GC和ZGC

    Java11中新增了两个GC,Epsilon GC和ZGC. Epsilon垃圾收集器 A NoOp Garbage Collector 没有操作的垃圾收集器 JDK上对这个特性的描述是:开发一个处理 ...