.NET WebApi 实战第六讲之POST方法实现

      一个系统的复杂度,往往因为表的繁多页变的越来越复杂,维护、开发等维度都会变的越来越广,越来越难以理解。这其中就包括数据处理方面,同一个业务场景的数据保存在不同的表中,就会出现多表联查这种不可避免的情况,当然本身所有数据库系统都是支持联查的,无论是左联查(left join)还是右联查(right join),亦或是模糊查寻。但是我们使用的是EF技术,是尽量避免去过多在数据库中进行操作,EF本身就是让我们注重精力在业务层面!所以,EF的联查也是一种技能,我们本节就重点实战EF的联查,看看看怎么写。在实战联查之前,我们有必要先实现api的POST实现 ,向学生成绩表中添加数据,将数据准备就续,我们再进行EF的多表查询功能实战。所以本节的重点是API的POST方法实现,为下一节的EF多表联查做好准备。

首先我们打开我们的SSMS,新建一个学生成绩表,包括各个学科的成绩。如下字段,保存为userAchievement表,为了学习演示方便,建议你所有的列名、数据类型都与我完全一致!别忘了设置主键!

打开我们的项目,选择DataProvider项目中的Model.edmx,双击打开:

在空白处右键:选择"从数据库更新模型(U)":

依次选择我们刚才新那家的学生成绩表:点击右下角的完成,等待生成完毕。

 生成完毕后,我们便可以看到新的模型显示:

 右键选中DataProvider 项目,选择重新生成!如果不重新生成,你是无法使用对应的EF模型的!生成后,再去展开Model.tt文件,可以看到,已经有了对应的模型!

至此,数据模型已经准备就续,现在我们实现一个POST方法,并且通过Postman工具调用此方法,向学生成绩表中写入数据!

关于postMan,我也给你准备好了第三方的教程 ,你照着学习了解安装即可,它只是一个接口测试工具。点击此处学习了解安装

打开我们Webapplication项目,在ApiModel控制器中定义成绩数据模型如下:此数据模型的目的就是在POST方法中作为接收前端传过来的实体参数。

实现如下方法,同时添加事务处理,将们的业务逻辑写在try语句里面,如果出现问题则事务回滚还原:

这里有必要讲解一下:csdnStudyEntities,这是什么东西呢?我们按住键盘的Ctrl键同时鼠标单击类名称,进入这个类的定义:

csdnStudyEntities其实就是我们建立的数据库!与库存在对应关系。下面红枉所示就是对应我们库里面的表!明白了吧!

你也许好奇的已经看到了我们每个方法里面都用到了using(){}语句,

using(){}语句方法,是为了能够及时的释放资源而设计的!当我们做一些比较占用资源的操作,而且该类或者它的父类继承了IDisposable接口,这样就可以使用using语句,在此范围的末尾自动将对象释放,常见的using使用在对数据库的操作的时候。

继续我们的接口实现!我们在try语句的内部实现以下逻辑:

至此,我们的POST方法已经写完,下来,我们需要进行测试,因为这个是POST方法,区别于GET方法将所有的参数以Key=value的形式直接拼写在URL后面。POST方法的所有的参数是在HTTP里面的BODY里面放着,是隐藏的,URL里面不会出现参数,所以,此时就必须使用POSTMAN这个测试工具进行测试了。先把我们的API运行起来。

在postman中进行配置:分别选择请求方法为POST,URL为https://localhost:44309/api/user/saveUserAchievement

Headers中添加我们此接口要正常响应的协议:Content-Type=application/json。你输入时会有自动提示,正确填写即可。

然后我们切换到body选项卡上:

配置接口参数:

{

"uid":"99D0ACDFE5C24936996F31D6A7C2EF63",

"literature":"98",

"math":"97",

"enlish":"94",

"bios":"96",

"physical":"99",

"history":"99",

"createDate":""

}

这里的uid从哪里来的呢?打开我们的数据库SSMS,在我们的库上右键新建查询:

给哪个用户写入数据,就必须是哪个用户的id,明白了吧,你需要正确填写你查出来的id,否则,根据我们的逻辑,你是无法正常将数据写入数据库的!

在我们的方法中打一个断点,当接口调用的时候,我们方便查看请求参数值:

 上面准备就续后,在postman中点击右边的send按钮,调用接口:

不出意外,我们的接口断点会被命中,你可以看看实体的值!将鼠标移动到参数名t上,依次展开,你便看到了传输过来的值!如下:

你可以按键盘上的F10一步一步执行,直到return.或者你点击上方的"继续"按钮,直接运行完成跳出断点。看看postman的返回!

是不是非常完美,现在我们去查一下我们的成绩表,看看数据!

 OK,非常完美,我们已经成功的通过POST方式将数据保存到我们的表中,这是何等的顺利!顺利之余,我们还是需要冷静的来想想这些流程有存在的问题:

第一个问题:数据模型涉嫌重复,新定义的数据模型毫无意义:

难不成我们要向不同表里面插入数据,需要定义那么多的数据模型吗?这个Achievement模型与EF生成的userAchievement何等的相似!!我们能不能直接使用EF生成的userAchievement呢?答案是可以的!没有任何问题!这里提出这个问题的目的是,我在实际项目开发中遇到了太多这样重复定义数据model的案例,真的是让人啼笑皆非!哭笑不得!所以,同学们,你们自己改造一下这个方法,使用EF生成的userAchievement,进行测试,中途出现的问题,自我排查解决,好好掌握一下基本的技能。

第二个问题:我们可不可以使用一种动态模型做为输入参数?为什么呢?可以将接口业务逻辑与EF生成的模型隔离开!新增加 如下方法:

在新接口处打个断点,将saveUserAchievement([FromBody] Achievement t)方法注释掉,如果你不注释,你将会得到新的报错!原因是不能同时出现两个POST方法!保存运行代码:

 打开postMan,替换接口API,其它所有数据不要动,点击Send按钮:看到依然运行保存成功 

 查一下数据库表,看一下数据:成功插入两条数据。

至此,POST方法教程实战完毕。同学们如往常一样,多进行总结归纳学习。话锋一转,但是!我们发现,我们的两个POST方法不能共存!不放,你把两个POST方法放开,然后通过postman调用接口,看看结果:

它的意思是说,找到两个匹配的接口,不知道执行哪个了!我们实际开发中,一个控制器包括多个POST方法是非常可能的!那么如何支持多POST方法呢?这个时候,我们就得调整路由规则了!

方案一、修改路由模板,如下

将其修改为:

运行postman,看看结果:

方案二、将方案一的方案还原为原来的格式,即删除掉/{action}。在控制器中实现动态路由配置。更灵活。

运行,看看结果:

至此结束。

下一节,我们将进行EF的多表联查

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容