闽公网安备 35020302035485号
Install-Package Microsoft.AspNetCore.Mvc.Api.Analyzers
值得注意的是,在 ASP.NET Core 3.0 中已经内置了 Microsoft.AspNetCore.Mvc.Api.Analyzers,所以不需要单独安装。
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
为了简单起见,我准备创建一个非常简单的 Repository,不连接数据库,如下代码所示: public class AuthorRepository
{
List<Author> authors = new List<Author>()
{
new Author
{
Id = 1,
FirstName = "Joydip",
LastName = "Kanjilal"
},
new Author
{
Id = 2,
FirstName = "Steve",
LastName = "Smith"
}
};
public async Task<Author> GetAuthor(int id)
{
var author = authors.FirstOrDefault(a => a.Id == id);
return await Task.FromResult<Author>(author);
}
public async Task<bool> SaveAuthor(Author author)
{
var result = authors.Where(a => a.Id == author.Id);
if(result == null)
{
authors.Add(author);
return await Task.FromResult(true);
}
return await Task.FromResult(false);
}
}
上面 AuthorRepository 类包含两个方法:GetAuthor() 和 SaveAuthor(),前者用于在集合中返回 author 实例,后者用于将 author 实例插入到集合中。
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
public async Task<ActionResult<Author>> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
[HttpPut]
public async Task<ActionResult<bool>> Put([FromBody] Author author)
{
var result = await authorRepository.GetAuthor(author.Id);
if (result == null)
return NotFound();
if (author == null)
{
return BadRequest();
}
try
{
var success = await authorRepository.SaveAuthor(author);
if (!success)
return BadRequest();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}
Install-Package Swashbuckle.AspNetCore
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiAnalyzersDemo API",
Version = "v1"});
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
});


[Route("api/[controller]")]
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<Author>> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}

[Route("api/[controller]")]
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
public class DefaultController : ControllerBase
{
AuthorRepository authorRepository = new AuthorRepository();
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<Author>> Get(int id)
{
if (id <= 0)
{
return BadRequest();
}
try
{
var author = await authorRepository.GetAuthor(id);
if (author == null)
return NotFound();
return Ok(author);
}
catch
{
return BadRequest();
}
}
[HttpPut]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<bool>> Put([FromBody] Author author)
{
var result = await authorRepository.GetAuthor(author.Id);
if (result == null)
return NotFound();
if (author == null)
{
return BadRequest();
}
try
{
var success = await authorRepository.SaveAuthor(author);
if (!success)
return BadRequest();
return Ok(author);
}
catch
{
return BadRequest();
}
}
}