2017-08-02 42 views
0

我已被分配到想出一个接收和发布数据的Web服务。但是,我对此很新,甚至在查看了多个示例并试图关注它们之后,我也有一些难以理解的地方。使用C#的restful Web服务

引用的例子:

Link 1

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

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

+0

不要忘了“处置”这方面。 –

回答

0

模型:它基本上是数据库的表结构。所以,无论何时您将创建一个对象并设置值并将该对象插入到数据库中。 控制器:它用于处理HTTP调用并将您的业务逻辑与View关联。

[HTTPGET]

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

[HTTPGET(“(编号)”)]

它映射到的GET请求,以及,但此时它需要一个所谓的查询参数。这是您的客户提供的更多信息,以使其请求更加具体。例如,它们可以请求API/web服务?ID = 1,它会问你用1

[HttpPost]

这映射到一个POST请求,并要求一个id返回对象你插入或更新一个对象。 [FromBody]告诉请求处理器将所谓的Request Body转换为给定类型的对象。请求主体是你的客户将放置整个对象的地方 - 例如转换以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一个DataTable作为主键,因为你正在使用[关键]属性。

private ApplicationDbContext _context; 

这用于创建数据库上下文。你可能也创造了ApplicationDbContext

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

下面这将创建一个DbSet与名称的WebService。

在WEB API中,POST用于插入新数据。因此,这里的API,将用于插入数据。在这里,将使用API​​中的API api/webservice 。您可以使用任何客户端(如POSTMAN或ARC)插入数据。您必须在HTTP调用请求的主体中设置数据。 根据您的输出,API的响应可以是JSON或XML。

+0

感谢您的帮助。我想我现在更了解它! – gram95

+0

复制我的内容?右.. – ggradnig

+0

你给了他一个详细的技术大纲,但除了使用你的知识,我试图用简单的术语来解释他。我想,他很容易明白这一点。 –

0

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

我发现非常有帮助的是,在我的浏览器中打开一个新选项卡,并使用开发人员工具(例如,通过右键单击任何位置然后单击“检查”),以切换到网络选项卡来观察流量。访问你选择的网站,说:wikipedia.org。

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

您现在应该查看“标题”选项卡,特别是请求标题。有两个重要字段:

  • 请求URL:它告诉服务器你想从它得到什么。这是一个资源定位器,这意味着您要从服务器访问资源,例如,您在应用程序中使用的一段HTML,图像或原始JSON数据。
  • 请求方法:这告诉服务器你想要对你试图访问的资源做什么。你想GET吗?或者你想PUT服务器上的一些资源?也许你想要DELETE it或POST对此资源的更改。

让我们回到您的源代码。

你在上面提供的是模型类和控制器类。

您的模型是一种数据结构,表示您的Web应用程序中的资源。 Id,Name,Timestamp,Date是该资源的属性。根据您的实际使用情况,您希望创建,使用,更新或删除此模型类型的对象,并决定其属性值。

为了让您的客户这样做,您有一个控制器类。它是为切入点所有的Web请求“地图”来:

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

地图的手段,当您的客户端请求URL(还记得我们的例子“www.wikipedia.org”)匹配您定义的字符串在你的路线,这个控制器类使用(注:[控制器]将与您的控制器类的实际名称所取代,在这种情况下,“web服务”

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

[HttpGet] 

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

[HttpGet("{id}")] 

这映射到一个GET请求为好,但这次它需要一个所谓的查询参数。这是您的客户提供的更多信息,以使其请求更加具体。例如,他们可以要求api/Webservice?id=1它会问你用1

[HttpPost] 

这映射到一个POST请求,并要求您插入或更新对象的ID返回对象。 [FromBody]通知请求处理器将所谓的请求主体转换为给定类型的对象。请求主体是你的客户将放置整个对象的地方 - 例如转换以JSON格式 - 他们想要提交给服务器。

现在,我希望这可以让你的代码示例更清晰一些。您还提到了查看,所以我会尽快解释它是什么:通常,在向服务器发送请求后,您会回复某种答案。在最简单的情况下,响应状态告诉客户端是否一切顺利。对于GET请求,您通常会返回响应主体中的对象。你返回的是所谓的视图。在您的示例:

return Ok(reading); 

转换一个从数据库中检索到的机器可读格式(例如JSON),并增加了响应状态“200 OK”到它的对象。这是发送给你的客户。

所以这应该给你一个关于web框架如何工作的好概述。我希望我能在这段相当长的阅读中帮助你。让我知道我是否可以澄清任何事情。

+0

感谢您的详细解释。我现在更了解这些概念。将继续研究它。 – gram95

+0

我可以用简单的术语来澄清一下,模型就像数据和数据库本身的结构,控制器允许客户端连接和请求模型,而视图是用户在请求后会看到的内容什么?很抱歉,很长的评论。 – gram95

+0

是的,你可以这样说。 – ggradnig