基于上一篇《创建基于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. ElasticSearch安装SQL插件

    ElasticSearch安装SQL插件下载地址(中国大佬开发的,膜拜ing):https://github.com/NLPchina/elasticsearch-sql 1.记得选择和自己Elast ...

  2. AppBoxFuture: 服务模型的在线调试

      框架内的服务模型(ServiceModel)用于处理各类业务逻辑(如最简单的CRUD操作),在设计时以类似于伪代码的形式存在,发布时后端会通过Roslyn转换并编译为运行时代码.为了方便开发者更简 ...

  3. Oracle数据库提权(低权限提升至dba)

    0x01 Oracle存储过程”缺陷” 在 Oracle 的存储过程中,有一个有趣的特点:运行权限.运行权限分为两种,definer 和 invoker. definer 为函数创建者的权限,而 in ...

  4. [POI2015]PIE

    题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求:( ...

  5. SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署.博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,不过静态文件还是存储 ...

  6. std::is_same

    两个一样的类型会返回true bool isInt = std::is_same<int, int>::value; //为true std::cout << std::is_ ...

  7. 【Autofac打标签模式】Aspect拦截器

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki 前提条件 自己new一个对象不能实现拦截器功能,必 ...

  8. 子字符串查找之————关于KMP算法你不知道的事

    写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...

  9. angular之模块开发二

    一.模块化规范 1.服务器端规范 CommonJS--node.js 2.浏览器端规范 AMD--RequireJS 国外相对流行 CMD--SeaJS 国内相对流行 3.模块化框架实现 CMD实现- ...

  10. 刷14道leetcode的总结

    引子 为什么我要刷leetcode?换工作?不是!那是?玩!巴菲特的双目标清单系统,基本方法是列两个清单,一个是职业生涯最重要的目标(不超过5个),另一个是比较重要的目标.对于比较重要的目标,要像躲避 ...