繁体   English   中英

使用C#的Restful Web Service

[英]Restful Web Service using C#

我被指派提出一个接收和发布数据的Web服务。 但是,我对此并不陌生,即使在查找了多个示例并尝试遵循它们之后,我仍然很难理解。

参考示例:

链接1

连结2

以下是我作为模型和控制器的参考提供的代码:

模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace Webservice.Models.ApiModels {
    public class SecondlyReading {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Name { get; set; }
        [Required]
        public string TimeStamp { get; set; }
        [Required]
        public string Date { get; set; }
        [Required]

    }
}

调节器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using SmartDBWeb.Data;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using SmartDBWeb.Models.ApiModels;
using Microsoft.EntityFrameworkCore;


namespace Webservice.Controllers.Api {
    [Route("api/[controller]")]
    [Authorize]
    public class WebserviceController : Controller {
        private ApplicationDbContext _context;


        public WebserviceController(ApplicationDbContext context) {
            _context = context;
        }

        // GET: api/Webservice
        [HttpGet]
        public IEnumerable<Webservice> GetSecondlyReadings() {
            return _context.Webservice.ToList();
        }

        // GET api/Webservice/id
        [HttpGet("{id}")]
        public async Task<IActionResult> GetWebservice(int id) {
            var reading = await _context.Webservice.SingleOrDefaultAsync(c => c.Id == id);
            if (reading == null) {
                return NotFound();
            }

            return Ok(reading);
        }

        [HttpPost]
        public IActionResult PostWebservice([FromBody]List<Webservice> Readings) {
            if (!ModelState.IsValid) {
                return BadRequest();
            }
            foreach (Webservice reading in Readings) {
                _context.Webservice.Add(reading);
            }

            _context.SaveChanges();
            return CreatedAtAction("GetWebservice", new { id = Readings[0].Id }, Readings[0]);
        }
    }
}

我的主要问题是上述代码的使用通常如何工作。 我发现(可能不正确)的是,模型是数据本身,而控制器将模型和视图链接在一起。

首先问自己网络通信通常如何工作。 当通过浏览器输入地址访问任何网站时,幕后实际上发生了什么?

我发现非常有用的是在浏览器中打开一个新标签,并使用开发人员工具(例如,右键单击任何地方,然后单击“检查”),通过切换到网络标签来观察流量。 访问您选择的网站,例如:Wikipedia.org。

现在,一堆东西还在进行,但是您对网络通信列表中第一个新条目感兴趣,该条目应为“ www.wikipedia.org”。 点击那个。

现在,您应该查看“标头”标签,尤其是请求标头。 有两个重要领域:

  • 请求URL:告诉服务器您要从中获得什么。 它是资源定位器,这意味着您要从服务器访问资源,例如,在应用程序中使用的一段HTML,图像或原始JSON数据。
  • 请求方法:告诉服务器您要使用的资源。 您要获取吗? 或者你希望服务器上的一些资源? 也许你想删除或更改发布到该资源。

让我们回到您的源代码。

上面提供的是Model类和Controller类。

您的模型是一个数据结构,表示Web应用程序中的资源。 ID,名称,时间戳,日期是该资源的属性。 根据您的实际用例,您要创建,使用,更新或删除此模型类型的对象,并确定其属性值。

为了允许您的客户这样做,您需要一个控制器类。 这是“映射”到的所有Web请求的入口点:

[Route("api/[controller]")]

Map表示,当客户的请求网址(记住我们的示例“ www.wikipedia.org”)与您在Route中定义的字符串匹配时,将使用此控制器类(注意:[controller]将替换为实际名称)控制器类的名称,在本例中为“ Webservice”。

在您的控制器中定义Actions 根据客户端请求的请求URL和请求方法(参见上文),您的Web框架将决定调用哪个操作。

[HttpGet]

这映射到URL api/Webservice的GET请求。 动作的返回类型是List,这意味着应该返回多个对象。 在您的情况下,当客户端访问api/Webservice ,将返回_context.Webservice中的所有对象。

[HttpGet("{id}")]

这也映射到GET请求,但是这一次它需要一个所谓的Query Parameter 这是您的客户提供的一条附加信息,以使其请求更加具体。 例如,他们可能正在请求api/Webservice?id=1 ,这将要求您返回ID为1的对象。

[HttpPost]

这映射到POST请求,并要求您插入或更新对象。 [FromBody]告诉请求处理器将所谓的请求 [FromBody]转换为给定类型的对象。 请求主体是您的客户端将整个对象(例如,以JSON格式转换)放置到它们要提交到服务器的位置。

现在,我希望这会使您的代码示例更清晰。 您还提到了View ,所以我将快速解释一下这是什么:通常,在对服务器进行请求之后,您将以某种答案进行响应。 在最简单的情况下, 响应状态会告诉客户端一切是否顺利。 对于GET请求,通常会在Response Body中返回一个对象。 您返回的内容称为视图。 在您的示例中:

return Ok(reading);

将从数据库中检索到的对象转换为机器可读格式(例如JSON),并向其添加响应状态“ 200 OK”。 这已发送给您的客户。

因此,这应该使您对Web框架的工作原理有一个很好的了解。 我希望我能为您提供较长的阅读帮助。 让我知道是否可以澄清任何事情。

模型:基本上是数据库的表结构。 因此,无论何时创建对象并设置值并将对象插入数据库中。 控制器:用于处理HTTP调用并将业务逻辑与视图链接。

[HTTPGET]

这将映射到对URL api / Webservice的GET请求,而没有任何查询参数。 动作返回类型是一个列表,这意味着应该返回多个对象。 在您的情况下,当客户端访问api / Webservice时,将返回_context.Webservice中的所有对象。

[HTTPGET( “(编号)”)]

这也映射到GET请求,但是这一次它需要一个所谓的查询参数。 这是您的客户提供的一条附加信息,以使其请求更加具体。 例如,他们可能正在请求api / Webservice?id = 1,这将要求您返回ID为1的对象。

[HttpPost]

这映射到POST请求,并要求您插入或更新对象。 [FromBody]告诉请求处理器将所谓的请求正文转换为给定类型的对象。 请求主体是您的客户端将整个对象(例如,以JSON格式转换)放置到它们要提交到服务器的位置。 因此,对于模型

public class SecondlyReading {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Name { get; set; }
        [Required]
        public string TimeStamp { get; set; }
        [Required]
        public string Date { get; set; }
    }

这将创建一个以Id作为主键的数据表,因为您正在使用[Key]属性。

private ApplicationDbContext _context;

这用于创建数据库上下文。 您可能还在ApplicationDbContext类中创建了以下内容

public DbSet<SecondlyReading> WebService{get; set;}

它将创建一个名称为WebService的DbSet。

在WEB API中, POST用于插入新数据。 因此,此处的POST中的API api / webservice将用于插入数据。 您可以使用任何CLIENT(如POSTMAN或ARC)插入数据。 您必须在HTTP调用的请求正文中设置数据。 API的响应可以是JSON或XML,具体取决于您的输出。

我认为最好阅读基础知识,这样您才能了解Web API的正常工作方式以进行自读https://www.asp.net/web-api

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM