使用HttpClient呼叫Web API - 1

by vivid 4. 十月 2017 17:35

.NET Magazine國際中文電子雜誌
作 者:許薰尹
審 稿:張智凱
文章編號:
N171018801
出刊日期: 2017/10/4

這一系列的文章有兩篇,第一篇是介紹如何在ASP.NET Core MVC 2.0專案中建立Web API,第二篇則是介紹在MVC的控制器之中,利用「HttpClent」類別來呼叫它們。

 

環境準備

本文使用ASP.NET Core MVC 2.0進行開發,除了安裝Visual Studio 2017之外,需將其更新Visual Studio 2017 15.3版。到微軟網站下載並安裝.NET Core SDK 2.0:https://www.microsoft.com/net/core#windowscmd

環境準備完成就就可以開始進行開發了。

 

建立ASP.NET Core Web Application專案

啟動Visual Studio 2017開發環境。從「File」-「New」-「Project」,在「New Project」對話盒中,確認視窗上方.NET Framework的目標版本為「.NET Framework 4.6」或以上版本,選取左方「Installed」-「Templates」-「Visual C#」程式語言,從「.NET Core」分類中,選取「ASP.NET Core Web Application」。設定專案名稱與專案存放路徑,按下「OK」鍵,請參考下圖所示:

clip_image002

圖 1:建立ASP.NET Core Web Application專案。

在「New ASP.NET Core Web Application」對話盒中,確認左上方的清單選取「.NET Core」,右上方的清單ASP.NET Core版本為「ASP.NET Core 2.0」,選取下方的「Web API」樣版專案,清除勾選下方的「Enable Docker Support」核取方塊,確定右方的「Authentication」項目設定為「No Authentication」,然後按下「OK」按鈕建立專案,請參考下圖所示:

clip_image004

圖 2:建立範本專案。

檢視Visual Studio 2017自動在專案中建立的「ValuesController.cs」檔案,目前的程式碼看起來如下,「ValuesController」繼承自「Controller」類別,其中包含Get、Post、Put與Delete等方法,一個現成的Web API程式就已經完成了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemo.Controllers {
  [Route( "api/[controller]" )]
  public class ValuesController : Controller {
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get( ) {
      return new string[] { "value1" , "value2" };
    }

    // GET api/values/5
    [HttpGet( "{id}" )]
    public string Get( int id ) {
      return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post( [FromBody] string value ) {
    }

    // PUT api/values/5
    [HttpPut( "{id}" )]
    public void Put( int id , [FromBody] string value ) {
    }

    // DELETE api/values/5
    [HttpDelete( "{id}" )]
    public void Delete( int id ) {
    }
  }
}

 

選取Visual Studio 2017開發工具「Build」-「Build Solution」選單,編譯目前的專案,確認程式碼能正確編譯。接著按CTRL+F5執行網站首頁(請注意:埠號可能會依據實際上的操作而有所不同,請修改為實際的埠號),由於在ValuesController類別上方套用Route Attribute設定路由為「"api/[controller]"」,因此只要在瀏覽器輸入以下URL,就可以叫用Web API:

http://localhost:1880/api/values

執行結果參考如下瀏覽器會送出HTTP GET請求到ASP.NET WEB API,因此將會叫用ASP.NET WEB API的Get方法,以下是使用Chrome瀏覽器呼叫時,回傳的JSON資料:

clip_image006

圖 3:預設Web API會回傳JSON資料。

若在瀏覽器網址列輸入以下URL:

http://localhost:1880/api/values/100

執行的結果請參考下圖所示,將呼叫Web API有帶參數的Get方法,回傳「value」字串:

clip_image008

圖 4:叫用有帶參數的Get方法。

結束執行程式,回到Visual Studio 開發工具程式編輯畫面。

 

在Web API控制器使用模型

從「Solution Explorer」視窗 - 專案名稱上方按滑鼠右鍵,從快捷選單選擇「Add」-「New Folder」選項,將新建立的資料夾命名為「Models」。

從Visual Studio 2017開發工具 -「Solution Explorer」- 「專案」 -「Models」資料夾上方按滑鼠右鍵,從快捷選單選擇「Add」-「New Item」,開啟「Add New Item」對話盒,從右上方文字方塊輸入「Class」搜尋,選定義模型。從Visual Studio 2017開發工具-「Solution Explorer」- 專案-「Models」資料夾上方按滑鼠右鍵,從快捷選單選擇「Add」- 「New Item」,開啟「Add New Item」對話盒,從右上方文字方塊輸入「Class」搜尋,選取「Class」,在「Name」後方的文字方塊設定名稱為「Course」,然後按下「Add」按鈕,建立新類別。

clip_image010

圖 5:加入Course模型。

修改新產生的「Course」類別,加入兩個屬性:「int」型別的「Id」與「string」型別的「Name」屬性,目前Course類別的程式看起來如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebAPIDemo.Models {
  public class Course {
    public int Id { get; set; }
    public string Name { get; set; }
  }
}

 

從「Solution Explorer」視窗 -「Controllers」資料夾上方,按滑鼠右鍵,從快捷選單選擇「Add」-「New Scaffolded Item」或「Controller」項目,在「Add MVC Dependencies」對話盒中選取「Minimal Dependencies」項目,然後按下「Add」按鈕,請參考下圖所示(這個對話盒只會在專案建立後新增控制器的第一次出現):

clip_image012

圖 6:加入相依套件。

從「Solution Explorer」視窗 -「專案」 -「Controllers」資料夾上方按滑鼠右鍵,從快捷選單選擇「Add」- 「New Scaffolded Item」或「Controller」項目,開啟「Add Scaffold」對話盒,選取「API」分類下的「API Controller with read / write actions」,然後按下「Add」按鈕:

clip_image014

圖 7:加入Web API控制器。

在「Add Controller」對話盒中,設定控制器名稱為「CourseController」;然後按下「Add 」按鈕,請參考下圖所示:

clip_image016

圖 8:加入MVC控制器。

工具將產生以下CourseController類別的程式碼,CourseController類別的上方套用[Produces] Attribute,指定要產生JSON格式的回應,預設ASP.NET Core MVC也只支援JSON格式,不過也允許你指定Formatter將其序列化成其它格式,例如XML。而 [Produces] Attribute則不管你是否有使用其它的Formatter,將強制回應的格式為JSON。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemo.Controllers {
  [Produces( "application/json" )]
  [Route( "api/Course" )]
  public class CourseController : Controller {
    // GET: api/Course
    [HttpGet]
    public IEnumerable<string> Get( ) {
      return new string[] { "value1" , "value2" };
    }

    // GET: api/Course/5
    [HttpGet( "{id}" , Name = "Get" )]
    public string Get( int id ) {
      return "value";
    }

    // POST: api/Course
    [HttpPost]
    public void Post( [FromBody] string value ) {
    }

    // PUT: api/Course/5
    [HttpPut( "{id}" )]
    public void Put( int id , [FromBody] string value ) {
    }

    // DELETE: api/ApiWithActions/5
    [HttpDelete( "{id}" )]
    public void Delete( int id ) {
    }
  }
}

 

 

設計Web API查詢功能

修改「CourseController」類別程式碼,在程式檔案最上方,引用模型所在的命名空間:

using WebAPIDemo.Models;

在CourseController類別階層宣告一個courses集合,新增三筆課程資料:

private static List<Course> courses = new List<Course> {
      new Course { Id = 1, Name = " ASP.NET Core MVC "},
      new Course { Id = 2, Name = " JavaScript "},
      new Course { Id = 3, Name = " Entity Framework Core "}
  };

 

修改「CourseController」類別中不帶參數的Get方法,回傳courses物件所成的列舉:

[HttpGet]
public IEnumerable<Course> Get( ) {
  return courses;
}

修改「CourseController」類別中帶id參數的Get方法,回傳符合篩選條件的課程資料:

[HttpGet( "{id}" , Name = "Get" )]
public Course Get( int id ) {
  var course = courses.Find( c => c.Id == id );
  return course;
}

選取Visual Studio 開發工具「Build」-「Build Solution」編譯目前的專案,確認程式碼能正確編譯。按CTRL+F5執行網站首頁(請注意:埠號可能會依據實際上的操作而有所不同,請修改為實際的埠號),然後在瀏覽器輸入以下URL:

http://localhost:1880/api/course

執行結果參考如下,以下是使用Chrome瀏覽器呼叫時,回傳的JSON資料:

clip_image018

圖 9:叫用Web API回傳課程資料。

修改瀏覽器上的URL,在URL最後方輸入參數「1」:

http://localhost:1880/api/course/1

則使用Chrome瀏覽器呼叫時,以JSON格式,回傳一號課程的資料:

clip_image020

圖 10:叫用Web API回傳課程資料。

結束執行程式,回到Visual Studio 開發工具程式編輯畫面。

 

設計Web API 新增功能

接下來來談談新增功能的設計。修改「CourseController」類別的「Post」方法,傳入「Course」物件當參數,並叫用集合的「Add」方法將傳入的「Course」物件加入集合之中:

 

[HttpPost]
public void Post( [FromBody]Course course ) {
  courses.Add( course );
}

 

 

設計Web API 修改功能

修改「CourseController」類別的「Put」方法,傳入「Course」當參數,叫用「Find」方法找尋集合中和參數「Id」相符的資料,修改其「Name」屬性值:

[HttpPut( "{id}" )]
public void Put( [FromBody]Course course ) {
   var item = courses.Find( c => c.Id == course.Id );
   item.Name = course.Name;
}

 

 

設計Web API 刪除功能

修改「CourseController」類別的「Delete」方法,傳入「id」當參數,並叫用「Remove」方法將與傳入的「Course」物件「Id」屬性相符的資料從集合中移除:

[HttpDelete( "{id}" )]
public void Delete( int id ) {
  var course = courses.Find( c => c.Id == id );
  courses.Remove( course );
}

 

目前「CourseController」類別的完整程式碼看起來如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WebAPIDemo.Models;
namespace WebAPIDemo.Controllers {
  [Produces( "application/json" )]
  [Route( "api/Course" )]
  public class CourseController : Controller {
    private static List<Course> courses = new List<Course> {
          new Course { Id=1, Name=" ASP.NET Core MVC "},
          new Course { Id=2, Name=" JavaScript "},
          new Course { Id=3, Name=" Entity Framework Core "}
      };
   
    // GET: api/Course
    [HttpGet]
    public IEnumerable<Course> Get( ) {
      return courses;
    }
   
    // GET: api/Course/5
    [HttpGet( "{id}" , Name = "Get" )]
    public Course Get( int id ) {
      var course = courses.Find( c => c.Id == id );
      return course;
    }

    // POST: api/Course
    [HttpPost]
    public void Post( [FromBody] Course course ) {
      courses.Add( course );
    }
   
    // PUT: api/Course/5
    [HttpPut( "{id}" )]
    public void Put( [FromBody] Course course ) {
      var item = courses.Find( c => c.Id == course.Id );
      item.Name = course.Name;
    }
   
    // DELETE: api/ApiWithActions/5
    [HttpDelete( "{id}" )]
    public void Delete( int id ) {
      var course = courses.Find( c => c.Id == id );
      courses.Remove( course );
    }

  }
}

 

選取「Build」-「Build Solution」編譯目前的專案,確認程式碼能正確編譯選取Visual Studio 「Build」-「Build Solution」編譯目前的專案,確認程式碼能正確編譯。在下一篇文章中,我們再來探討如何使用HttpClient類別來叫用Web API。

Tags:

ASP.NET Core MVC | .NET Core | .NET Magazine國際中文電子雜誌 | 許薰尹Vivid Hsu

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List