使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门

简介: 原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了。
原文: 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门

系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html

前言

经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了。在正式开始之前,再一次回顾一下Web Api的应用场景:Web Api可以与 MVC,WebForm结合使用,也可以作为一个单独的Web服务。在正式讨论Web Api的配置以及如何构造我们的URI来消费资源之前,我们必须理解Http方法与我们将要访问的资源之间的关系。举个简单的例子,我们把模型”Course”作为我们访问的资源,下面就列举了访问这个资源的http方法:

Action HTTP Verb Relative URI
获取所有课程信息 GET /api/courses
根据某个Id获取单个课程 GET /api/courses/id
新增一个课程 POST /api/coursesNew course is sent in POST body
更新一个课程 PUT or PATCH /api/courses/idUpdated course is sent in POST body
删除一个课程 DELETE /api/courses/id

 

第一步:创建Web Api项目

右击解决方案->添加新建项目

image

下一步:

image

点击确定

第二步:配置第一个路由

在创建好项目之后,我们可以在App_Start文件夹下看到“WebApiConfig”类。这个类就是用来配置路由信息的,这个类最终会在“Global.asax”的Application_Start()方法中被调用,后面我们会在这个这个类里面配置多条路由信息。

配置第一个路由:

config.Routes.MapHttpRoute(
                name: "Courses",
                routeTemplate: "api/courses/{id}",
                defaults: new {controller="courses", id = RouteParameter.Optional }
            );

分析一下上面这段代码:我们创建了一个Courses的路由规则,这个路由模板会匹配到“api/courses/{id}”的URI,在这个模板定义了2个默认值(api,courses)以及一个可选值(id)。对于“/api/courses or /api/courses/5”URI就会被我们的路由模板匹配到,同时“/api/courses”URI也会被匹配到,因为Id是可选的。

第三步:添加第一个控制器(courses controller)

Web Api中的Controller是用来处理客户端Http请求的(与MVC中的Controller类似),首先,创建Controller——右击Controller文件夹->新建项->控制器

然后出现下面窗口:

image

选择Web API 2控制器-空,并命名为CoursesController。然后确定

打开刚才创建的Controller,可以看到我们创建的类继承自“ApiController”。同时对于这个类的类名必须是“CoursesController”,因为在Web Api中默认的控制器选择方式是寻找所有继承自“ApiController”类并且这个类是以“Courses”开头(这是在我们的路由规则中配置的)的控制器。

第四步:在Controller中添加Action

首先,我们创建上述表格列举到的前2个方法(GetAllCourses,GetCourseById)

方法的选择是智能的,如果我们创建了2个方法Get()和GetCourse(int id),假设我们发送一个GET请求并且URI是“/api/courses/5”,那么“GetCourse(int id)”方法就会被选择执行,这是因为方法是以Get开头而且URI中包含Id的值。这种选择方式同样适用以其他的Http方法(put,delete,post),下面上代码:

public class CoursesController : ApiController
    {
        public List<Course> Get()
        {
            ILearningRepository repository = new LearningRepository(new LearningContext());
 
            return repository.GetAllCourses().ToList();
        }
 
        public Course GetCourse(int id)
        {
            ILearningRepository repository = new LearningRepository(new LearningContext());
 
            return repository.GetCourse(id);
        }
     }

当我们创建一个Get请求并且URI是“http://localhost:{your_port}/api/courses”时候,Get()方法会被选择调用,下面是相应的部分代码:

[
    {
        "Id": 1,
        "Name": "History Teaching Methods 1",
        "Duration": 3,
        "Description": "The course will talk in depth about: History Teaching Methods 1",
        "CourseTutor": {
            "Courses": [],
            "Id": 1,
            "Email": "Ahmad.Joudeh@outlook.com",
            "UserName": "AhmadJoudeh",
            "Password": "SWDQNPSE",
            "FirstName": "Ahmad",
            "LastName": "Joudeh",
            "Gender": 0
        },
        "CourseSubject": {
            "Courses": [],
            "Id": 1,
            "Name": "History"
        },
        "Enrollments": []
    },
    {
        "Id": 2,
        "Name": "History Teaching Methods 2",
        "Duration": 3,
        "Description": "The course will talk in depth about: History Teaching Methods 2",
        "CourseTutor": {
            "Courses": [],
            "Id": 1,
            "Email": "Ahmad.Joudeh@outlook.com",
            "UserName": "AhmadJoudeh",
            "Password": "SWDQNPSE",
            "FirstName": "Ahmad",
            "LastName": "Joudeh",
            "Gender": 0
        },
        "CourseSubject": {
            "Courses": [],
            "Id": 1,
            "Name": "History"
        },
        "Enrollments": []
    },

如果你发送一个Get请求并且URI是“http://localhost:{your_port}/api/courses/5”。那么GetCourse(int id)将会被选择调用执行。但是很遗憾在调用这个方法之后就会产生一个异常,这个异常信息简单来说就是“序列化对象的时候出现了循环依赖”,换句话说就是对象间循环引用(Course>Enrollment>Course>Enrollment>etc…)

总结

到目前为止我们已经让Web Api跑起来了,但仍然有很多不足之处:

   返回对象时出现循环依赖,可以通过模型工厂模式解决。

   我们返回了领域模型中所有的字段给客户端,然而有一些敏感信息不应该返回(例如:password字段),解决方案:模型工厂模式

   每一个返回给客户端的资源都应该包含一个URI以便客户端查询,解决方案依旧是模型工厂模式。

   对于返回单个资源,我们应当返回相应的状态码(例如:成功200,资源未找到404等),解决方案:HttpResponseMessage对象

  在每个方法里我们都实例化了一个repository,这个对象包含了一些昂贵的操作(例如:数据库连接),解决方案:依赖注入模式

  对于返回的Json对象格式是以“帕斯卡”风格的(例如“FirstName”),然而我们的Api有很大的可能被带有Javascript的客户端消费,对于JS开发者来说可能更适合“驼峰”风格(例如”firstName”)的数据。解决方案:配置Json格式。

ok,下一章我们就着重解决上述的问题

本章代码:http://yun.baidu.com/share/link?shareid=2010367762&uk=17559114&third=0

目录
相关文章
|
10月前
|
JSON 安全 Java
API 一键转换 MCP 服务!Higress 助今日投资快速上线 MCP 市场
今日投资的技术负责人介绍了如何通过Higress MCP 市场完善的解决方案,快捷地将丰富的金融数据 API 转化为 MCP 工具,帮助用户通过 MCP 的方式非常轻松地调用专业金融数据,自由快速地构建自己的金融大模型应用。
1215 23
|
9月前
|
人工智能 算法 API
国产化用于单导联和六导联的心电算法及API服务
随着智能设备普及,心电图功能逐渐应用于智能手表、体脂仪等设备。苏州唯理推出单导联及6导联心电算法API服务,由AI驱动,1分钟内快速评估心律失常、房颤、早搏等问题,已广泛用于医疗设备及三甲医院。其算法还可评估压力、疲劳、情绪状态,筛查效率远超进口设备。唯理率先实现国产医疗级心电芯片,支持快速集成与私有化部署,适用于多种智能硬件。
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
2742 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
人工智能 算法 安全
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
Quasar Alpha 是 OpenRouter 推出的预发布 AI 模型,具备百万级 token 上下文处理能力,在代码生成、指令遵循和低延迟响应方面表现卓越,同时支持联网搜索和多模态交互。
1000 1
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
|
11月前
|
人工智能 自然语言处理 API
硅基流动入驻阿里云云市场,核心API服务将全面接入阿里云百炼平台💐
2025年6月18日,AI Infra企业硅基流动与阿里云达成战略合作,加入“繁花计划”并入驻云市场。其大模型推理平台SiliconCloud核心API将接入阿里云百炼平台,依托灵骏智能计算集群为客户提供高效服务。作为国内领先的MaaS平台,SiliconCloud已集成百余款开源大模型,服务600万用户及众多企业。双方将在算力协同、行业解决方案等领域深化合作,推动AI生态发展。
1284 0
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
804 2
|
人工智能 运维 安全
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者
403 4
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
666 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
790 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
416 7