asp.net core WebAPI实现CRUD

本节用于构建一个简单的WebAPI来管理to-do列表。不会创建用户界面。

API Description Request body Response body
GET /api/todo Get all to-do items NoneArray of to-do items
GET /api/todo/{id} Get an item by ID NoneTo-do item
POST /api/todo Add a new item To-do itemTo-do item
PUT /api/todo/{id} Update an existing item   To-do itemNone
DELETE /api/todo/{id}     Delete an item     NoneNone


下图现实了一个应用程序的基本设计:

        

 

.客户端消费Web API,一般客户端是指移动应用程序和浏览器。本节不创建客户端,使用Postman or curl作为客户端来测试APP。


.Model表示用程序数据的对象。在这里,Model是指一个to-do item.Model表示一个C#类。也就是一个POCO(一个简单C#对象)。


.控制器是处理HTTP请求并创建HTTP响应的对象。这个程序有一个单一的控制器。


.为了简化本节教程,应用程序不使用持久性数据库。教程将使用内存存储对象。

一、先决条件

.DotNetCore 2.0 sdk 或者更高版本

.带有ASP.NET和Web开发工作负载的VS2017 版本15.3 或者或者更高版本。

二、创建项目

 从VS中选择File menu ,>New>Project

 选择ASP.NET Core Web Application(.net core)项目模板。项目名称"TodoApi"并选择OK.

    

在New ASP.NET Core Web Application - TodoApi 对话框中,选择WebAPI模板。选择OK ,不选中Enable Docker Support 

   

启动APP

在Visual Studio中,按下CTRL+F5启动APP,VS启动浏览器并导航到http://localhost:port/api/values,其中port是随机选择端口号。浏览器显示如下:

1
["value1","value2"]

创建模型类

model是一个C#对象,在app中用来展示数据,在这里model就是只一个to-do item.

添加一个Models文件夹,在解决方案中。并在文件夹中添加TodoItem类。

使用下面代码更新TodoItem类。


namespace TodoApi.Models
{
public class TodoItem
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
}

当创建一个TodoItem数据库自动生成Id.

创建一个database context

database context是为模型提供数据的主要类配合Entity Framework.这个类继承自Microsoft.EntityFrameworkCore.DbContext。在Models文件夹下添加一个TodoContext类. 用下列代码替换


using Microsoft.EntityFrameworkCore;
namespace TodoApi.Models
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options) :
base(options)
{
}
public DbSet<TodoItem> TodoItems { get; set; }
}
}

 注册一个database context

在这个步骤中,database context注册到DI容器,DI容器中注册的服务可用于控制器中。

 使用内置的DI容器注册DBContext,使用下面代码:


using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using TodoApi.Models;
namespace TodoApi
{
public class Startup
{      
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
}
}
}

上面代码:

 .移除不使用的代码。

 .指定一个内存数据库使用注入到service容器。

添加一个controller

在解决方案中,右击Controls文件夹,选择 Add > New Item.在Add New Item对话框中,选择Web API Controller Class 模板。为类起一个名字叫TodoController.

用下面代码替换


using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using TodoApi.Models;
using System.Linq;
namespace TodoApi.Controllers
{
[Route("api/[controller]")]
public class TodoController : Controller
{
private readonly TodoContext _context;
public TodoController(TodoContext context)
{
_context = context;
if (_context.TodoItems.Count() == 0)
{
_context.TodoItems.Add(new TodoItem { Name = "Item1" });
_context.SaveChanges();
}
}      
}
}

.定义了一个空的控制器类。在下面,我们添加一些方法实现API。

.构造函数使用DI提供一个TodoContext并注入到Controller中。在Controller中DataBase context实现CRUD方法。

.如果内存数据库中没有todoItem,构造函数默认将添加一个。

获取to-do Items

对于获取一个to-do Items,添加下面代码在TodoController类中。


[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
return _context.TodoItems.ToList();
}
[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
var item = _context.TodoItems.FirstOrDefault(t => t.Id == id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}

上面代码是两个Get方法:

.GET /api/todo

.GET /api/todo/{id}

当调用GetAll方法时。HTTP响应显示如下:


[
{
"id": 1,
"name": "Item1",
"isComplete": false
}
]

路由和URL路径

[HttpGet] 特性指定一个HTTP Get方法。每个方法的URL路径构造如下:

.获取模板字符串在控制器Route特性:

namespace TodoApi.Controllers
{[Route("api/[controller]")]    public class TodoController : Controller{        private readonly TodoContext _context;


 .用控制器的名称替换[controller],即控制器的类名减去"Controller"后缀。在这个示例中,控制器的类名是TodoController,根名是"todo"。ASP.NET 路由不区分大小写。

 .如果[HttpGet]属性有一个路由模板(如[HttpGet("/products")]),将其追加到路径中..

 在GetById方法中:


[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
var item = _context.TodoItems.FirstOrDefault(t => t.Id == id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}

"{id}"是todo item的ID是占位符变量,当调用GetById时,它将URL中的"{id}"的值复制给方法的id参数。

Name = "GetTodo" 创建了一个路由名称
 .启动应用程序使用路由名称创建一个HTTP连接。
 .在稍后文章将做解释。

返回值

GetAll方法返回一个IEnumerable。MVC自动把对象序列化成JSON,并将JSON写入的响应Body中。对这个方法的响应Code是200,假设没有未处理的异常。

相比之下GetById方法返回更一般的IActionResult类型,它表示大范围的返回类型。

GetById有两个不同的返回类型:

.如果没有Item匹配请求的ID,该方法返回404错误。返回NotFound返回一个HTTP 404响应。

.否则,该方法返回200与JSON响应正文。返回ObjectResult返回一个HTTP 200响应。

 

三、实现另外一些CRUD操作

Create

添加一个Create方法


[HttpPost]
public IActionResult Create([FromBody] TodoItem item)
{
if (item == null)
{
return BadRequest();
}
_context.TodoItems.Add(item);
_context.SaveChanges();
return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
}

上面是一个HTTP的POST方法。由[HttpPost]指定。[FormBody]特性告诉MVC从HTTP请求的正文中获取to-do Item。

CreateAtRoute方法:

.返回201响应。HTTP 201是一个HTTP POST方法的标准的响应在服务器上创建新资源。

.添加一个Location到响应头。Location头指定了新创建的to-do item的URL。

.使用"GetTodo"命名路由来创建URL。在GetById中定义了"GetTodo"命名路由:


[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(long id)
{
var item = _context.TodoItems.FirstOrDefault(t => t.Id == id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}

使用Postman发送一个Create request

.设置HTTP方法为POST

.选择Body radio Button

.选择raw radio Button

.设置类型为JSON

在编辑器中输入下面JSON


{
"name":"walk dog",
"isComplete":true
}

.选择Send

.选择Headers tab页

 

 

使用Location headerURI能访问新添加的Item.

 

Update

添加下列Update代码:


[HttpPut("{id}")]
public IActionResult Update(long id, [FromBody] TodoItem item)
{
if (item == null || item.Id != id)
{
return BadRequest();
}
var todo = _context.TodoItems.FirstOrDefault(t => t.Id == id);
if (todo == null)
{
return NotFound();
}
todo.IsComplete = item.IsComplete;
todo.Name = item.Name;
_context.TodoItems.Update(todo);
_context.SaveChanges();
return new NoContentResult();
}

Update有点类似Create,但是使用HTTP PUT. 响应204(No Content). 根据HTTP规范,PUT请求需要客户端发送整个更新的实体, 而不仅是增量。要支持部分更新,请使用HTTP PATCH.

 

Delete

添加下面Delete方法


[HttpDelete("{id}")]
public IActionResult Delete(long id)
{
var todo = _context.TodoItems.FirstOrDefault(t => t.Id == id);
if (todo == null)
{
return NotFound();
}
_context.TodoItems.Remove(todo);
_context.SaveChanges();
return new NoContentResult();
}

 

OK,就写到这里,下节我们将介绍使用Swagger生成ASP.NET CORE WebAPI帮助文档。

原文地址:http://www.cnblogs.com/netcoder/p/7801447.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop2.6.0的Intellij Idea 插件

一、Hadoop2.6.0的Idea Intellij插件下载 github源码地址 github插件压缩包 二、安装插件 setting》Plugins》install plugins from disk 选择压缩包&#xff0c;重启Idea就行 安装完的结果&#xff1a;

v-for指令案例详解

对于v-for指令&#xff0c;以前老是不能理解&#xff0c;经常记混&#xff0c;所以特地写篇笔记来加强下记忆&#xff0c;希望借此能学的更深刻一点 v-for顾名思义就是个for循环&#xff0c;是vue的一个循环。在遍历json字符串的时候有奇佳的效果&#xff0c;感觉就是为他们而造…

Docker ASP.NET Core 2.0 微服务跨平台实践

本篇博文的目的&#xff1a;在 Mac OS 中使用 VS Code 开发 ASP.NET Core 2.0 应用程序&#xff0c;然后在 Ubuntu 服务器配置 Docker 环境&#xff0c;并使用 Docker 运行 Consul 和 Fabio 环境&#xff0c;最后使用 Docker 运行 ASP.NET Core 2.0 应用程序。 你要的项目源码&…

微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

在今天召开的 Connect(); 2017 开发者大会上&#xff0c;微软宣布了 Azure、数据、AI 开发工具的内容。这是第一天的 Connect(); 2017 的主题演讲。 在开场视频中霍金又来了。你记得这个Intel为他开发的系统使用了C#&#xff0c;而且是开源的&#xff0c;在Github上地址&#x…

Hadoop生态hive(五)Hive QL数据库

&#xff08;1&#xff09;查看数据库 show databases; &#xff08;2&#xff09;使用数据库 use db; &#xff08;3&#xff09;查看当前数据库 #与mysql的select database();不一样 select current_database(); &#xff08;4&#xff09;创建数据库 create database [if …

讨论.NET Core 配置对GC 工作模式与内存的影响

引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 Asp.net core应用在 Kubernetes上内存使用率过高问题分析 这篇文章中讨论了&#xff0c;在默认情况下&#xff0c;ASP.NET Core程序跑在K8s的Docker中内存使用率>600MB&#xff0c;导致Docker容器频繁重启…

Hadoop生态hive(六)Hive QL表

一、创建表 语法&#xff1a; create [temporary] [external] table [if not exists] [db_name.] table_name [(col_name data_type [comment col_comment], ...)] [comment table_comment] [row format row_format] [stored as file_format] 例子&#xff1a; create tab…

v-for渲染img标签图片

错误的示例 <div v-for"item in list"><img src"{{item.image}}" /> </div>这样做会报错 正确的做法应该是 <div v-for"item in list"><img :src"item.image" /> </div>这样就可以把后端接口的…

Mono的新解释器

Mono即将通过它的JIT编译器和静态编译器以及一个.net解释器以带来一些新的方式来运行你的代码. 在2001年Mono项目诞生之时&#xff0c;我们为.net指令集实现了一个解释器用基于它实现了一个在Linux上的自托管的.net开发环境. 当时我们把解释器定义为一个用来构建JIT编译器的临时…

欢乐纪中某B组赛【2019.1.27】

前言 写完T1T1T1和T2T2T2颓了半天 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2222017myself2017myself2017myself2302302301001001001001001003030304442017xxy2017xxy2017xxy2002002001001001001001001000001111112017zyc2017zy…

Apache Druid(一)简介

翻译自 Apache Druid Apache Druid&#xff08;正在孵化&#xff09;是一个开源的分布式数据存储。德鲁伊的核心设计结合了OLAP /分析数据库&#xff0c;时间序列数据库和搜索系统的思想&#xff0c;为广泛的用例创建了一个统一的系统。Druid将这三个系统中的每个系统的关键特…

[ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了

发现问题 在将 FineUIMvc&#xff08;支持ASP.NET MVC 5.2.3&#xff09;升级到 ASP.NET Core 2.0 的过程中&#xff0c;我们发现一个奇怪的现象&#xff1a; 通过项目引用 FineUICore 工程一切正常&#xff0c;但是将 FineUICore 编译后&#xff0c;通过程序集的引用方式就会报…

设计事件驱动的微服务

事件驱动的微服务是一个未受到应有探讨的领域&#xff0c;在近日举行的Con伦敦2017微服务大会上&#xff0c;Greg Young表达了这样的观点。同时&#xff0c;他还特别强调&#xff0c;不应该对所有的微服务都使用事件驱动模式。相反&#xff0c;他建议逐个服务进行考察&#xff…

express中获取url参数

问号传参获取参数 获取 http://127.0.0.1:3001/user?id10&namezs 中的查询参数&#xff1a; 直接使用 req.query 获取参数即可&#xff1b; 注意&#xff1a;URL 地址栏中通过 查询字符串 传递的参数&#xff0c;express 框架会直接解析&#xff0c;大家只需使用 req.que…

处理ASP.NET Core中的HTML5客户端路由回退

在使用由Angular&#xff0c;React&#xff0c;Vue等应用程序框架构建的客户端应用程序时&#xff0c;您总是会处理HTML5客户端路由&#xff0c;它将完全在浏览器中处理到页面和组件的客户端路由。几乎完全在浏览器中... HTML5客户端路由在客户端上工作的很好&#xff0c;但是当…

TFS在项目中DevOps落地进程(下)

紧接上篇 TFS在项目中Devops落地进程&#xff08;上&#xff09; 再接着说TFS相关之前先插入一个番外篇&#xff0c;虽然跟TFS关系不大但跟DevOps关系很大&#xff0c;觉得有必要在此乱入一下。 番外篇--监控之Application Insights 我们之前并没有任何监控类产品&#xff08;我…

欢乐纪中某B组赛【2019.1.28】

前言 心态爆炸 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD3332017myself2017myself2017myself1901901901001001005050500004040401313132017zyc2017zyc2017zyc1701701707070706060600004040401313132017hzb2017hzb2017hzb1701…

这应该是目前最快速有效的ASP.NET Core学习方式(视频)

ASP.NET Core都2.0了&#xff0c;它的普及还是不太好。作为一个.NET的老司机&#xff0c;我觉得.NET Core给我带来了很多的乐趣。Linux&#xff0c; Docker&#xff0c; CloudNative&#xff0c;MicroService&#xff0c;DevOps这些都能跟它很完美的结合&#xff0c;再加ASP.NE…

大叔公开课~微服务与持久集成

闲话多说 免费报名&#xff1a;http://www.genshuixue.com/teacher/classCourseDetail/171117794648么可以通过阅读原文报名 .Net Core来了&#xff0c;带给我们的是什么&#xff1f;跨平台&#xff0c;无疑是最大的亮点&#xff01; Docker横空出世&#xff0c;让开发者和运维…

语音服务——腾讯云

腾讯语音服务文档 一、开通语音消息服务流程 &#xff08;1&#xff09;注册并认证 如果您还没有腾讯云账号&#xff0c;您需要 注册腾讯云 账号&#xff0c;并完成 企业实名认证。如果您已有企业认证的腾讯云账号&#xff0c;请直接进行下一步操作。 申请开通语音消息服务 …