使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

简介: 原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新增),Put(修改),Delete(删除),Get(查询)。
原文: 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

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

前言

在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新增),Put(修改),Delete(删除),Get(查询)。查询在前几章我们已经实现了,本章就在我们的案列(CourseController)中实现put,post和delete方法。

使用Http Post方法创建一个Course

首先,在“CourseController”中创建Post(CourseModel courseModel)方法,具体代码如下:

public HttpResponseMessage Post([FromBody] CourseModel courseModel)
{
    try
    {
        var entity = TheModelFactory.Parse(courseModel);
 
        if (entity == null) Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not read subject/tutor from body");
 
        if (TheRepository.Insert(entity) && TheRepository.SaveAll())
                {
                    return Request.CreateResponse(HttpStatusCode.Created, TheModelFactory.Create(entity));
                }
                else
                {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not save to the database.");
                }
    }
    catch (Exception ex)
    {
 
         return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
    }
}

上面的代码主要做了以下的事:

1.方法名为Post因此客户端发起的Http请求必须也是Post

2.方法接受一个CourseModel类型的参数,对于复杂类型的参数Web Api会从Http请求的Body部分反序列化出来,因此客户端必须发送一个代表CourseModel类型的对象参数(我觉得就是一些Key Value键值对——key对应CourseModel的属性名,Value就是属性值)

3.对于新增操作,我们在操作成功之后返回201(资源创建)的同时,把 新创建的资源返回也是必要的,因为这个这个资源包含了一个在服务器端自动生成的Id。

4.我们在ModelFactory中新增了一个Parse方法用来将我们的CourseModel转化为domain model(“Course”),这个方法代码就不贴了,在本章代码中给出。

ok,我们测试一下:发送一个Post请求到(http://localhost:{your_port}/api/courses/)请求部分如下图所示:

image

解释下这个请求:

1.设置header部分“content-type”属性为“application/json”因为我们发送的数据格式是JSON格式。

2.设置header部分“accept”属性为“application/json”因为我们希望接受的数据格式也是JSON格式。

3.请求的Body部分是一个以JSON格式序列化的“CourseModel”,正如我们之前说的——一个课程对应一个科目同时对应一个导师(具体模型之间的关系,可以参考:http://www.cnblogs.com/fzrain/p/3491804.html),所以在新增课程的时候我们需要指定科目的Id和导师的Id,在我们的Parse方法中就会根据这些Id来创建有效的领域模型——Course,最终通过Repository存入数据库。

如果这个post请求执行成功,那么一个新的Course即被创建,我们接受到的响应报文应该如下图所示:

image

使用Http Put方法更新一个Course

在“CourseController”中创建Put(int Id CourseModel courseModel)方法,具体代码如下:

[HttpPatch]
[HttpPut]
public HttpResponseMessage Put(int id, [FromBody] CourseModel courseModel)
{
    try
    {
 
        var updatedCourse = TheModelFactory.Parse(courseModel);
 
        if (updatedCourse == null) Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not read subject/tutor from body");
 
        var originalCourse = TheRepository.GetCourse(id);
 
        if (originalCourse == null || originalCourse.Id != id)
        {
            return Request.CreateResponse(HttpStatusCode.NotModified, "Course is not found");
        }
        else
        {
            updatedCourse.Id = id;
        }
 
        if (TheRepository.Update(originalCourse, updatedCourse) && TheRepository.SaveAll())
        {
            return Request.CreateResponse(HttpStatusCode.OK, TheModelFactory.Create(updatedCourse));
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.NotModified);
        }
 
    }
    catch (Exception ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
    }
}

解释一下上面的代码:

1.方法名为Put,因此需要客户端发送put请求,但是在我们的方法上打了Patch特性,那就说明put和patch请求都将执行这个方法。对于put和patch请求的区别在于——当我们需要更新CourseModel所有字段时用“put”,只更新部分字段时用“Patch”,但在我们的put方法中无需区分这2者。

2.在我们的put方法中需要接受2个参数(Id和CourseModel),Id是包含在URL中,而CourseModel则应该在请求的Body中。

3.对于更新成功我们返回200状态码和更新过的Course,没成功返回304(Not Modified)。

ok,我们测试一下:发送一个Put请求到(http://localhost:{your_port}/api/courses/1003)请求部分如下图所示:

image

解释下这个请求:

1.设置header部分“content-type”属性为“application/json”因为我们发送的数据格式是JSON格式。

2.设置header部分“accept”属性为“application/json”因为我们希望接受的数据格式也是JSON格式。

3.请求的Body部分是一个以JSON格式序列化且需要更新的“CourseModel“。

如果put方法执行成功,那么我们会获得200的响应状态码以及更新过的Course。

使用Http Delete方法删除一个Course

在“CourseController”中创建Delete(int Id )方法,具体代码如下:

public HttpResponseMessage Delete(int id)
    {
        try
        {
            var course = TheRepository.GetCourse(id);
 
            if (course == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }
 
            if (course.Enrollments.Count > 0)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, "Can not delete course, students has enrollments in course.");
            }
 
            if (TheRepository.DeleteCourse(id) && TheRepository.SaveAll())
            {
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
 
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }

解释一下上面代码:

1.方法名为delete,所以对应的http请求应该是delete。

2.方法接收一个参数Id,而Id应该在URL中设置,所以请求正文的内容为空。

3.如果删除成功,我们返回200状态码,删除失败时返回400(BadRequest)的同时把错误内容也返回给客户端

ok,我们测试一下:发送一个Delete请求到(http://localhost:{your_port}/api/courses/1003)请求部分如下图所示:

image

在项目中添加StudentController

studentController用于对Students实现CRUD,主要涉及以下功能:

1.使用Get请求获取所有学生信息。

2.发送Get请求获取单个学生信息(注:在这里我们将UserName作为参数传递到服务器,这个方法是基于Basic authentication,因此只有提供用户名的密码才能查询到相应的信息,在讲Web Api安全性的时候我们着重来说这里)。

3.通过Post请求新增一个学生。

4.通过Put或Patch请求修改一个学生。

5.通过Delete删除一个学生。

这里就不给出StudentController中的详细代码了,和CourseController中的基本相似,大家可以在本章最后给的代码链接中获得,这里列举一下在WebApiConfig中添加的路由代码:

config.Routes.MapHttpRoute(
            name: "Students",
            routeTemplate: "api/students/{userName}",
            defaults: new { controller = "students", userName = RouteParameter.Optional }
        );

总结

到此为止,我们已经将Http方法所对应操作资源的CRUD介绍完了,下一章我们将介绍资源间的关联,敬请期待。

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

目录
相关文章
|
14天前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
11天前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在DataWorks同步数据时,遇到乱码问题,该怎么解决(rest api数据源)
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
21 0
|
13天前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
|
13天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
28 1
|
18天前
|
JSON JavaScript API
访问REST API:在Vue中消费和管理远程数据
【4月更文挑战第23天】本文探讨了在Vue应用中高效访问REST API的方法,包括选择合适的API、使用Axios或Fetch发送请求、封装API服务、处理响应和数据、错误管理及性能优化。关键点在于创建服务层封装请求,使用计算属性和方法处理数据,以及实施错误处理和性能提升策略。通过这些最佳实践,开发者能更好地管理和消费远程数据,构建出动态、响应式的Vue应用。
|
9天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
21小时前
|
编解码 数据库 计算机视觉
LabVIEW开发基于Web数字图像处理
LabVIEW开发基于Web数字图像处理
|
3天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0
|
3天前
|
存储 程序员 API
python web开发示例详解
python web开发示例详解
13 0
|
3天前
|
XML 前端开发 JavaScript
CSR(客户端渲染)和AJAX在Web开发中各自扮演不同的角色
【5月更文挑战第8天】CSR(客户端渲染)与AJAX在Web开发中各司其职。CSR提供初始HTML框架,通过JavaScript在浏览器端获取并渲染数据,提升交互性和响应速度。AJAX则实现页面局部更新,如实时搜索,不刷新页面即可获取数据。CSR可能因DOM操作多而引发性能问题,但可优化解决;AJAX适合频繁交互场景,提高响应性。两者在不同需求下各有优势,需按项目选择适用技术。
13 4