2017-08-02 450 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