P21 创建 Company 资源 POST




现在一共有两个实体

争对CompanyController创建Action

CompanyDto现在主要是用来做输出的,我们的post是做输入,输入参数和输出参数通常是不一样的。当然也偶尔有时候是一模一样的

添加CompanyAddDto信用做新增的实体。不同作用的dto还是都要单独建立的,以为随着业务需求的变化,它后续有可能还是不一样的。分成多个类dto比较有利于重构。查询、创建、更新这三类分别是三个不同的dto

这里的[FromBody]可写可不写。

争对低版本的.net core的版本,如果传进来的对象是空的 就抛出400错误。

博主记得最早的.net core版本里面好像是没有[ApiController]这个Attribute的,


在那个时候或者是你没有使用[ApiController]这个Attribtue的是时候,就需要检查下请求里面body里面的参数,是否正确的转化成了我们的CompanyAddDto这个类。
当请求的body里面什么都没有的时候,或者是里面的参数不正确的时候,那么我们的这个company参数就会变成null


现在我们就不需要手动的去检查传递的companyAddDto对象是否为空对象,因为我们的Controller使用了[ApiController]这个Attribute。
如果遇到了刚才说的那种情况传递说来的对象为空,那么框架会自动返回400 BadRequest

所以这里我们可以把这段代码去掉了。框架会自动的帮我们判断,并返回400BadRequest

Mapper映射

传递过来的对象,我们首先要转换为Company

AutoMapper的映射

在这句话执行之后呢,实际上这个entity并没有添加到数据库里面。

我们F12进来看具体的代码。最后一行代码,这个实体目前只是被添加到了DbContext里面。

想要保存到数据库内就要调用DbContext的SaveChangesAsync方法。我们在Repisitory里面已经封装了这个方法。

这里我们再调用一个saveAsync方法就可以了。这个Repository对象我们可以把他看做是一个黑盒,controller不需要知道里面的实现细节。
这个黑盒也可以说对于Controller来说他就是一个接口。所以我不知道他的实现细节,到底有没有包含记录日志 啊,或者是有没有处理异常 啊。
具体的实现细节对Controller来说都是未知的。
假如说controller在插入数据库的时候除了问题,抛出了异常,那么其实我也不用处理。因为抛出异常后,框架会保证返回500错误。所以这里我们就不处理异常了。

保存成功后,使用CreatedAtRoute()方法,





把dto改个名字,叫做returnDto

运行测试


最好再指定下Accept。就是返回接收的格式

注意是post请求。

加上判断,Employee不为空才去执行下面的操作。刚开始创建一个公司是没有员工。



请求的body设置。

相应的地址最后有个Location。通过这个地址我们可以获取到这个新创建的资源。



再次执行这个post请求。新生成的公司 id不一样了。说明这个资源又被创建了一个。

我们再执行以下get,获取所有的公司

测试空的body



返回的是400错误。这代表的是客户端引起的错误。

故意把name改成布尔类型的为false

发送请求,依然返回的是400 错误。这都因为我们的Controller使用了ApiController这个Attribute


 

结束

原文地址:https://www.cnblogs.com/wangjunwei/p/12546169.html