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 应该没有别的了吧.
最新文章
- 解决开启服务器防火墙导致ftp不能连接的问题
- 【COGS 254】【POI 2001】交通网络图
- Leetcode 70 Climbing Stairs 递推
- 能源项目xml文件 -- app-init.xml
- qt里标识操作系统的宏
- codeforces 432D Prefixes and Suffixes
- 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
- 飘逸的python - zlib压缩存到数据库
- 在虚拟机上配置linux lab的相关经验
- jQuery 属性操作 - attr() 方法
- 13. ZooKeeper最佳实践
- javase--day_01
- USB接口禁用与启用
- HTML学习笔记Day11
- K - Super A^B mod C
- 二:python 对象类型概述
- Java通过遍历sessionId获取服务器所有会话session
- StreamSets学习系列之StreamSets是什么?
- router之switch
- pycharm中python模板代码自动生成
热门文章
- epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
- [VS] - ";包含了重复的“Content”项。.NET SDK 默认情况下包括你项目中的“Content”项。
- C# ms speech文字转语音例子
- php 输出缓存,每秒打印一个数字
- 使用Navicat for MySQL添加外键约束
- 2018年11月16日 我和SB交流有代沟-继续字符串4
- MongoDB 创建索引及其他
- linux下关于mysql的命令的用法
- Python hasattr() 函数 // python中hasattr()、getattr()、setattr()函数的使用
- 【做题】arc080_f-Prime Flip——转换、数论及匹配