锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / ASP.NET开源技术 / Web API实现HTTP动作:POST、PUT和DELETE
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

Web API实现HTTP动作:POST、PUT和DELETE


在这篇文章中,我们将继续为“CoursesController”实现其他HTTP操作,然后简要讨论我们在“StudentsController”中实现的内容。
使用HTTP Post操作创建新课程
我们将向“CoursesController”添加名为Post(CourseModel courseModel)的新方法,以下是实现代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

 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);
        }
    }

在上面的实现中,我们需要注意四件事情:

  • 名为“Post”的方法,所以客户端需要发出HTTP Post请求。
  • 该方法接受类型为CourseModel的参数,在复杂类型的Web API参数中,从请求体反序列化。所以客户端必须以JSON格式发送一个CourseModel对象的序列化表示。
  • 对于执行此操作时可能发生的所有可能情况,我们已经返回了适当的“HttpResponseMessange”。如果资源创建成功,服务器应该返回HTTP响应201(创建资源)以及创建的资源。返回在响应消息中创建的资源非常重要,因为它将包含在服务器上生成的CourseId。
  • 我们在“ModelFactory”类中引入了一个名为“Parse”的方法,该方法负责将“CourseModel”解析成可以添加到我们的存储库中的“Course”域模型对象。您可以使用GitHub浏览最新版本的“ ModelFactory ”和“ BaseApiController ”类,以便检查引入的更改以应用“Parse”功能。

为了测试这个,我们需要打开fiddler并选择Composer选项卡,我们将向URI发出POST请求:http:// localhost:{your_port} / api / courses /请求将如下图所示:
Post
在这个HTTP POST请求中,我们需要注意以下几点:

  • 因为我们正在请求正文中发送JSON数据,所以将“内容类型”标题设置为“application / json”。
  • 因为我们以JSON格式返回响应,所以将“accept”标题设置为“application / json”。
  • 请求体包含复杂的“CourseModel”的反序列化JSON数据,如前所述,每个课程都有一个导师和主题相关,所以发送主题和导师的Ids是足够的,因为“TheModelFactory.Parse”函数负责从数据库检索这些对象,并构建可以与我们的存储库一起使用的有效域对象模型。

如果此POST请求在服务器上成功执行,并且创建了一个新课程,我们将在响应头中接收状态代码201(创建资源)以及响应主体中在服务器上创建的新课程。你可以检查如下图像:
PostResult
使用HTTP PUT操作更新现有课程
我们将向“CoursesController”类添加名为Put(int Id,CourseModel courseModel)的新方法,如下面的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

[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, false);

            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);
        }
    }

在上面的实现中,我们需要注意以下几点:

  • 方法名为“PUT”,所以客户端需要发出HTTP PUT请求,但是我们在Put方法中添加了“HttpPatch”属性,所以客户端可以发出PUT或PATCH请求,并且都将使用Put方法执行。Put和Patch之间的区别是,如果我们要更新“CourseModel”的所有字段,我们需要使用PUT,如果我们要更新部分字段,我们需要使用PATCH,在我们的实现中,我们不需要区分这两个动作。
  • Put方法接受两个参数,URI中设置的更新资源的ID以及更新后的 “CourseModel”,表示在请求体中反序列化的复杂类型。
  • 对于执行此操作时可能发生的所有可能情况,我们已经返回了适当的“HttpResponseMessange”。如果资源更新成功,服务器应返回HTTP响应200(OK)以及创建的资源。如果资源未被修改,服务器应该返回HTTP响应304(未修改)。

要测试这个,我们需要使用fiddler并选择Composer选项卡,我们将向URI发出一个PUT请求:  http:// localhost:{your_port} / api / courses / 33请求将如下图所示:
PutResult
在这个HTTP PUT请求中,我们需要注意以下几点:

  • 因为我们正在请求正文中发送JSON数据,所以将“内容类型”标题设置为“application / json”。
  • 因为我们以JSON格式返回响应,所以将“accept”标题设置为“application / json”。
  • 请求体包含“CourseModel”更新反序列化JSON数据。

如果此PUT请求在服务器上成功执行,并且课程已更新,我们将在响应头中接收状态代码200(OK)以及响应主体中服务器上更新的课程。
使用HTTP DELETE操作删除课程
我们将向“CoursesController” 添加名为Delete(int Id)的 新方法  ,如下面的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

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);
        }
    }

在上面的实现中,我们需要注意以下几点:

  • 方法名为“DELETE”,所以客户端需要发出HTTP DELETE请求。
  • Delete方法接受 已删除课程的  Id参数,Id在URI中设置,请求体为空。
  • 对于执行此操作时可能发生的所有可能情况,我们已经返回了适当的“HttpResponseMessange”。如果资源被成功删除,服务器应该返回HTTP响应200(OK)。如果删除资源失败的服务器应该返回HTTP响应400(错误请求)和解释内容为什么请求无法处理。

为了测试这个,我们需要使用fiddler并选择Composer选项卡,我们将向URI发出DELETE请求:  http:// localhost:{your_port} / api / courses / 33请注意,请求的正文是空的请求将如下图所示:
DeleteResult
将学生控制器添加到项目中
新的控制器“StudentsController”将负责对学生进行CRUD操作。控制器将负责执行以下操作:

  • 通过向URI发送GET请求列出所有可用的学生:  http:// localhost:{your_port} / api / students /
  • 通过向URI发送GET请求列出单个学生:  http:// {your_port} / api / students / HasanAhmad 请注意,我们通过传递userName而不是Id来识别资源。这种方法使用基本身份验证来保护,所以资源所有者只有在提供用户名密码后才可以查询他的详细信息。 一旦我们谈论保护Web API,我们将详细介绍这一点。
  • 通过向URI发送POST请求来添加新学生:  http:// localhost:{your_port} / api / students /
  • 通过向URI发送PUT / PATCH请求来更新现有的学生:  http:// localhost:{your_port} / api / students / {userName}
  • 通过向URI发送DELETE请求来删除学生:  http:// localhost:{your_port} / api / students / {userName}

我不会在这里列出“StudentsController”的代码,因为它与“CoursesController”是一样的,您可以在GitHub上浏览它。我将列出我们添加到“WebApiConfig”类的新路由配置。

1
2
3
4
5

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

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内