Asp.net core 学习笔记 ( Web Api )

更新 : 2020-02-21

前端传值的时候, 如果没有传某些属性该怎么处理比较好呢?

假设要传一个 class 里面有一个 int 属性

如果我们跑默认的配置的话, 在 controller 会收到 value 0

web api 在转换 json 时会弄好默认值.

但如果 string, object, list  则不会处理, 会返回 error

c# 8 之后, 如果 string, object, list 不是 nullable 的话,我们是需要设置默认值的。

目前我的规范是, string 没给就放 "" 作为默认值, list = new List 作为默认,  object 就报错.

所以除了 object 基本上其它的都可以有默认值。

最近对 1-1 的 table 有了一个新规定,就是尽可能要有,所以我 object 这种情况下也可以 default value 给它哦.

.

更新: 2019-12-13

incomplete JSON response

多半是因为 response 了 entity, 然后被循环引用搞砸了.

解决方案是 startup 调 config

  services.AddMvc().AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

但更好的是不要返回 entity, 因为返回值应该是 DTO 才对. 要经过处理丫, 权限丫

 

更新 : 2019-06-03 

web api 返回 json 的情况下默认会把属性 PascalCase 变成 camelCase 很贴心哦.

如果你不喜欢可以修改它

  services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver())

但是这个对 odata 的 response 是没有影响的哦, odata 不会自动 camelCase 的.

asp.net core 把之前的 webapi 和 mvc 做了结合.

mvc 既是 api.

但是后来,又发现, api 确实有独到之处,所以又开了一些补助的方法.

namespace Project.Controllers
{
public class PostForm
{
[Required]
public IFormFile file { get; set; }
} [ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private DB Db { get; set; }
public ProductsController(DB db)
{
Db = db;
} [HttpGet]
public ActionResult<List<Product>> Get()
{
return Ok(Db.Products);
} [HttpGet("{Id}")]
[ProducesResponseType()]
[ProducesResponseType()]
public ActionResult<Product> GetById(string Id,[Required] string code)
{
return NotFound();
} [HttpPost]
[ProducesResponseType()]
public async Task<ActionResult<Product>> Post(Product product)
{
Db.Add(product);
await Db.SaveChangesAsync();
return Ok(product);
} [HttpPost("upload")]
[ProducesResponseType()]
public ActionResult<string> Upload([FromForm] PostForm form)
{
return Ok("filename");
}
}
}

继承的是 ControllerBase 而不是 MVC 常用的 Controller. Controller 会继承 ControllerBase

[ApiController], 使用标签 ApiController 会开启自动 model valid 检查, 自动 binding FromBody, FromQuery 等, 但 FromForm 还是要自己写哦 (默认 api 都是 json 的嘛) , 如果你担心它的智能,也可以完全自己写.

或则把它某个智能关掉 . Add the following code in Startup.ConfigureServices after services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);:

services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
});

[HttpPost("nextSegment")] 通过 http method 标签,我们可以很容易的写各做方法, 比如 get,post,put,delete, route 功能也包在内了真好呢.

[ProducesResponseType] 这个标签主要功能是为了方便做 document, 配合 ActionResult<T> 泛型, 我们可以简单的表示正常情况下的返回,其余不正常情况使用 ProducesResponseType 来表示.

通常是 404, 400 应该没有别的了吧.

上一篇:Docker搭建Redis


下一篇:Redis安全