上篇文章,我们试着调用API,成功返回值,今天接下来看看代码是怎么构成的

 1 [Route("api/[controller]")]
 2     [ApiController]
 3     public class TodoController : ControllerBase
 4     {
 5         private readonly TodoContext _context;
 6 
 7         public TodoController(TodoContext context)
 8         {
 9             _context = context;
10 
11             if (_context.TodoItems.Count() == 0)
12             {
13                 // Create a new TodoItem if collection is empty,
14                 // which means you can't delete all TodoItems.
15                 _context.TodoItems.Add(new TodoItem { Name = "Item1" });
16                 _context.SaveChanges();
17             }
18         }
19 
20       
21         // GET: api/Todo
22         [HttpGet]
23         public ActionResult<IEnumerable<TodoItem>> GetDataList()
24         {
25             return  _context.TodoItems.ToList();
26         }
27         [HttpPost]
28         public IActionResult Create( TodoItem item)
29         {
30             if (item == null)
31             {
32                 return BadRequest();
33             }
34 
35             _context.TodoItems.Add(item);
36             _context.SaveChanges();
37 
38             return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
39         }
40         [HttpPut("{id}")]
41         public IActionResult Update(long id, [FromBody] TodoItem item)
42         {
43             if (item == null || item.Id != id)
44             {
45                 return BadRequest();
46             }
47 
48             var todo = _context.TodoItems.FirstOrDefault(t => t.Id == id);
49             if (todo == null)
50             {
51                 return NotFound();
52             }
53 
54             todo.IsComplete = item.IsComplete;
55             todo.Name = item.Name;
56 
57             _context.TodoItems.Update(todo);
58             _context.SaveChanges();
59             return new NoContentResult();
60         }
61         [HttpDelete("{id}")]
62         public IActionResult Delete(long id)
63         {
64             var todo = _context.TodoItems.FirstOrDefault(t => t.Id == id);
65             if (todo == null)
66             {
67                 return NotFound();
68             }
69 
70             _context.TodoItems.Remove(todo);
71             _context.SaveChanges();
72             return new NoContentResult();
73         }
74         // GET: api/Todo/5
75         [HttpGet("{id}")]
76         public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
77         {
78             var todoItem = await _context.TodoItems.FindAsync(id);
79 
80             if (todoItem == null)
81             {
82                 return NotFound();
83             }
84 
85             return todoItem;
86         }
87     }
View Code

首先我们的方法都写在Controller里面,这个Controller必须继承基类 ControllerBase

每个暴露给外面的接口方法都是public ,为了表明方法是post 或Get, 在方法的上面标注[HttpPost]或[HttpGet],这是一种约定,这是一种规范。

在这里有两个注意点.如果方法不标注,则Get和Post方法都支持,但是同时只能有一个对外开放的方法不标注

下面我们来验证下结论,方法不标注用Get方法调用

看,虽然HTTPGet注释了,但是方法还是成功的被调用

同样的 post 方法也能成功调用

为啥只能有一个API方法可以不标注,如果本来就已经标注了Get方法,不标注的方法还可以是Get方法吗?如果我们要有2个以上get方法是否可以,带着这些疑问,我们下篇文章再来验证。

 

posted on 2019-09-11 14:45  中年的危机  阅读(975)  评论(0编辑  收藏  举报