找回密码
 会员注册
查看: 150|回复: 0

使用ASP.NET Core开发Web API入门

[复制链接]

250

主题

1

回帖

819

积分

管理员

积分
819
发表于 2024-2-29 08:53:38 | 显示全部楼层 |阅读模式

什么是ASP.NET Core

ASP.NET Core 是一个跨平台的高性能开源框架,用于生成启用云且连接 Internet 的新式应用。

简单来说,就是比原来的ASP.NET新增了跨平台

ASP.NET Core 包含了ASP.NET Core MVCASP.NET Core Web API两部分,今天主要介绍ASP.NET Core Web API开发的常用技巧。ASP.NET Core 支持使用 C# 创建 RESTful 服务,也称为 Web API。

控制器Controllers

Web API 包含一个或多个派生自 ControllerBase 的控制器类。 Web API 项目模板提供了一个入门版控制器:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Mvc;
  6. namespace WebAPI.Controllers
  7. {
  8. [Route("api/[controller]")]
  9. [ApiController]
  10. public class ValuesController : ControllerBase
  11. {
  12. // GET api/values
  13. [HttpGet]
  14. public ActionResult<IEnumerable<string>> Get()
  15. {
  16. return new string[] { "value1", "value2" };
  17. }
  18. // GET api/values/5
  19. [HttpGet("{id}")]
  20. public ActionResult<string> Get(int id)
  21. {
  22. return "value";
  23. }
  24. // POST api/values
  25. [HttpPost]
  26. public void Post([FromBody] string value)
  27. {
  28. }
  29. // PUT api/values/5
  30. [HttpPut("{id}")]
  31. public void Put(int id, [FromBody] string value)
  32. {
  33. }
  34. // DELETE api/values/5
  35. [HttpDelete("{id}")]
  36. public void Delete(int id)
  37. {
  38. }
  39. }
  40. }
复制代码

所以你每次在VS中Debug的时候,都会打开默认浏览器,然后跳转到http://localhost:3019/api/values

注意,不要使用Controller的派生类来处理Web API的请求,Controller的派生类是用来处理Web页面的,简单来说,就是返回一个页面而不是接口。

ControllerBase 类提供了很多用于处理 HTTP 请求的属性和方法。 我自己常用的如下:

404

  1. return NotFound()
复制代码

400

  1. return BadRequest()
复制代码

200(主要用于GET请求)

  1. return Ok()
复制代码

 201(创建成功,主要用于POST请求)

  1. return Created(string uri, object value);
复制代码

这里提一下,如果想在返回状态响应码的同时返回自定义的json格式信息,可以这样做

在Models目录下定义一个返回信息类 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.ComponentModel.DataAnnotations;
  6. using Newtonsoft.Json;
  7. namespace WebAPI.Models
  8. {
  9. public class ReturnMessage
  10. {
  11. public int code { get; set; }
  12. public string message { get; set; }
  13. }
  14. }
复制代码

这个模型不需要映射数据库的表,因为我们不需要去增删改查数据库 。然后在接口里新建对象,直接塞进返回值。

  1. // GET: api/test/getresultmessage
  2. [HttpGet("getresultmessage")]
  3. public async Task<ActionResult<NewAURequest>> GetBooleanSurvey(string titleId)
  4. {
  5. try
  6. {
  7. ReturnMessage returnMessage = new ReturnMessage();
  8. returnMessage.message = "ok";
  9. returnMessage.code = 200;
  10. return Ok(returnMessage);
  11. }
  12. catch (Exception ex)
  13. {
  14. return BadRequest();
  15. }
  16. }
复制代码

这样访问 http://127.0.0.1:3019/api/getresultmessage就能返回这样的json格式数据。

  1. {
  2. "code": 200,
  3. "message": "ok"
  4. }
复制代码

关于路由

这个其实也是包含在控制器里的,但是我觉得比较重要,所以单独拿出来讲一下

当你在Models目录下创建一个TodoController的时候,这个控制器的根路由就是由下面这个控制,默认的如下

  1. namespace TodoApi.Controllers
  2. {
  3. [Route("api/[controller]")]
  4. [ApiController]
  5. public class TodoController : ControllerBase
  6. {
  7. private readonly TodoContext _context;
复制代码

对应的根路由就是http://127.0.0.1:3019/api/todo

 

将 [controller] 替换为控制器的名称,按照惯例,在控制器类名称中去掉“Controller”后缀。 对于此示例,控制器类名称为“Todo”控制器,因此控制器名称为“todo”****。 ASP.NET Core 路由不区分大小写。

模型Models

Web API接口开发无非增删改查,那么就得有对应的表数据,从简单的单表开始,没有关联关系。

在Models目录下添加模型类

  1. namespace TodoApi.Models
  2. {
  3. public class TodoItem
  4. {
  5. public long Id { get; set; }
  6. public string Name { get; set; }
  7. public bool IsComplete { get; set; }
  8. }
  9. }
复制代码

这里扩展一下其他常用字段的数据类型

  1. // guid
  2. public Guid Id { get; set; }
  3. // int
  4. public int Id { get; set; }
  5. // Time
  6. public DateTime submitTime { get; set; }
复制代码

添加数据库上下文,位置也可以放在Models目录下

  1. using Microsoft.EntityFrameworkCore;
  2. namespace TodoApi.Models
  3. {
  4. public class TodoContext : DbContext
  5. {
  6. public TodoContext(DbContextOptions<TodoContext> options)
  7. : base(options)
  8. {
  9. }
  10. public DbSet<TodoItem> TodoItems { get; set; }
  11. }
  12. }
复制代码

注册数据库上下文(Startup.cs文件,位于项目根路径下)

  • 删除未使用的 using 声明。
  • 将数据库上下文添加到 DI 容器。
  • 指定数据库上下文将使用内存中数据库。
  1. // Unused usings removed
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.Extensions.Configuration;
  7. using Microsoft.Extensions.DependencyInjection;
  8. using TodoApi.Models;
  9. namespace TodoApi
  10. {
  11. public class Startup
  12. {
  13. public Startup(IConfiguration configuration)
  14. {
  15. Configuration = configuration;
  16. }
  17. public IConfiguration Configuration { get; }
  18. // This method gets called by the runtime. Use this method to add services to the
  19. //container.
  20. public void ConfigureServices(IServiceCollection services)
  21. {
  22. services.AddDbContext<TodoContext>(opt =>
  23. opt.UseInMemoryDatabase("TodoList"));
  24. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  25. }
  26. // This method gets called by the runtime. Use this method to configure the HTTP
  27. //request pipeline.
  28. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  29. {
  30. if (env.IsDevelopment())
  31. {
  32. app.UseDeveloperExceptionPage();
  33. }
  34. else
  35. {
  36. // The default HSTS value is 30 days. You may want to change this for
  37. // production scenarios, see https://aka.ms/aspnetcore-hsts.
  38. app.UseHsts();
  39. }
  40. app.UseHttpsRedirection();
  41. app.UseMvc();
  42. }
  43. }
  44. }
复制代码

剩下的我不想复制粘贴了,自己去看官网的文档https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?view=aspnetcore-2.1

 

常用的Controller的用法

场景一

单表查询多条数据

假设有张表Person,包含Id和Name,Age,模型类如下:

  1. namespace TodoApi.Models
  2. {
  3. public class Person
  4. {
  5. public Guid Id { get; set; }
  6. public string Name { get; set; }
  7. public int Age{ get; set; }
  8. }
  9. }
复制代码

PersonController

  1. // GET: api/getpersonlist
  2. [HttpGet("getpersonlist")]
  3. public IEnumerable<Person> GetPersonList()
  4. {
  5. try
  6. {
  7. var definitionView = _context.Person;
  8. return definitionView;
  9. }
  10. catch (Exception ex)
  11. {
  12. return (IEnumerable<Person>)BadRequest();
  13. }
  14. }
复制代码

访问http://127.0.0.1:3019/api/person/getpersonlist

  1. {
  2. {
  3. "id": "020f8a77-b098-46b3-a708-211d9e4bffba",
  4. "name": "Mike",
  5. "age": 20
  6. },
  7. {
  8. "id": "616F9F07-931C-4CE3-BCC5-B4EC417076FC",
  9. "name": "Jake",
  10. "age": 18
  11. }
  12. }
复制代码

场景二

单表查询多条数据(URL携带参数)

假设我知道这个人的名字,需要查询单条数据

http://127.0.0.1:3019/api/person/getpersonlist/Mike,这个URL多了个参数

重新写一个方法映射新的URL请求

  1. // GET: api/getpersonbyname/xxx
  2. [HttpGet("getpersonbyname/{name}")]
  3. public async Task<ActionResult<Person>> GetPersonByName(string name)
  4. {
  5. try
  6. {
  7. var definitionView = await _context.Person.FirstOrDefaultAsync(o => o.Name == name);
  8. return definitionView;
  9. }
  10. catch (Exception ex)
  11. {
  12. return BadRequest();
  13. }
  14. }
复制代码
  1. {
  2. "id": "020f8a77-b098-46b3-a708-211d9e4bffba",
  3. "name": "Mike",
  4. "age": 20
  5. }
复制代码

场景三

关联表查询单条数据(URL携带参数)

待续...


来源:https://blog.csdn.net/ssjdoudou/article/details/107559440
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 12:00 , Processed in 1.810187 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表