Asp.Net MVC 4.0【Web API】


隨着技術的前沿,Asp.Net也很快就步入4.0的時代了,雖然現在還沒正式應用,據說MVC4.0出來的新特性很是犀利,各種犀利。結果一下給沒把持住,就涉足了一下。所以分享一下,大家願意涉足的就了解一哈。

首先,我們需要給我們的VS裝環境,目前MVC4.0還是(Beta)RC版,如果日后微軟發布正式版,我們需要卸載掉今天裝的RC版去裝正式版用。(安裝MVC4.0連接是:http://www.asp.net/vnext/overview/downloads).

MVC 4.0新出的特性可謂關注最強烈的就是Web API,那Web API 到底是什么東西呢?

ASP.NET的API也是一個框架,可以很容易地建立HTTP服務。既然了解到他也是一個框架,那么我們來搞一個簡單的Asp.Net的Web API.

創建一個Web API項目

啟動Visual Studio 2010,並選擇新建項目從 開始頁。或從文件菜單中,選擇“ 新建“,然后項目。在模板 “窗格中,選擇已安裝的模板 和擴展的Visual C#節點。在Visual C#中,選擇網絡。在項目模板列表中,選擇“ ASP.NET MVC Web應用程序。命名項目“HelloWebAPI”,然后單擊“ 確定“。如下圖1.

圖1.在新的ASP.NET MVC 4項目 “對話框中,選擇的Web API ,然后單擊“ 確定“。如下圖2.

圖2.

添加模型

一個模型是一個對象,表示應用程序中的數據。ASP.NET的Web API可以自動序列化你的模型,JSON,XML或其他格式,然后寫入到HTTP響應消息體序列化的數據。只要客戶端可以讀取序列化格式,它可以反序列化的對象。大多數客戶可以解析XML或JSON。此外,客戶端可以顯示的格式,希望通過設置HTTP請求消息中的Accept頭。

開始創建一個簡單的模型,代表了產品。
如果解決方案資源管理器中不可見,單擊“ 查看 “菜單,並選擇“解決方案資源管理器”。在Solution Explorer中,右鍵單擊Models文件夾。從上下文菜單中,選擇添加 ,然后選擇類。類命名為“Product”。接下來,添加以下屬性的Product類別。具體代碼如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HelloWebAPI.Models
{
    public class Product : Object
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Category { get; set; }

        public decimal Price { get; set; }
    }
}

 

添加控制器

一個控制器是一個對象,處理HTTP請求。來看看VS自動創建的Controller(控制器),具體如下:

  • HomeController中是一個傳統的ASP.NET MVC控制器。這是負責服務網站的HTML頁面,而不是直接相關的Web API。
  • ValuesController是一個例子WebAPI控制器。

刪除ValuesController 解決方案資源管理器中右鍵單擊文件, 並選擇“ 刪除“。兵器添加一個新的控制器,如下圖3.:(在解決方案資源管理器中,右鍵單擊Controllers文件夾。選擇“ 添加“ ,然后選擇“ 控制器“。)

圖3.在“ 添加控制器 “向導,將其命名控制器”的ProductsController“。在 模板下拉列表,選擇空API控制器。然后單擊添加。如下圖4.

圖4.(這里一定要看清楚模版),創建好ProductsController,具體修改代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net.Http;
using System.Net;
using System.Web.Http;

namespace HelloWebAPI.Controllers
{
    using HelloWebAPI.Models;
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]
        {
            new Product{Id = 1 ,Name="Huitai", Category="People",Price=1.25M},
            new Product{Id = 2,Name="Hello",Category="Hello",Price=4.5M},
            new Product{Id = 3,Name="ViewSonic",Category="Computer",Price=1500M}
        };

        /// <summary>
        /// 返回所有商品
        /// </summary>
        /// <returns>返回一個枚舉類型為Product</returns>
        public IEnumerable<Product> GetAllProducts() 
        {
            return this.products;
        }

        /// <summary>
        /// 返回單一商品信息
        /// </summary>
        /// <param name="id">商品的ID</param>
        /// <returns>商品</returns>
        public Product GetProductById(int id) 
        {
            var product = this.products.FirstOrDefault(p => p.Id == id);
            if (product == null)
            {
                var resp = new HttpResponseMessage(HttpStatusCode.NotFound);
                throw new HttpResponseException(resp);
            }
            return product;
        }
        /// <summary>
        /// 返回指定類別所有的商品
        /// </summary>
        public IEnumerable<Product> GetProductsByCategory(string category) 
        {
            return this.products.Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
        }
    }
}

現在我們就有一個工作網絡的API。每個控制器上的映射到一個URI的方法,具體如下:

控制器方法 URL
GetAllProducts /API/products
GetProductById /API/prdoucts/ID
GetProductsByCategory  

 

客戶端可以通過發送一個HTTP GET請求的URI調用的方法。我們來看看如何完成這種映射。結果如下圖5.

圖5.OK,我們需要看到的是我們想要的東西,而不是VS自動創建的Index.cshtml頁面。

我們試着用JavaScript和jQuery調用的Web API,首先我們先修改一下Index.cshtml頁面具體修改如下:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>ASP.NET Web API</title> 
    <script src="http://www.cnblogs.com/Scripts/jquery-1.6.2.min.js"  
        type="text/javascript"></script>
</head> 
<body> 
    <div> 
        <h1>All Products</h1> 
        <ul id='products' /> 
    </div> 
    <div> 
        <label for="prodId">ID:</label> 
        <input type="text" id="prodId" size="5"/> 
        <input type="button" value="Search" onclick="find();" /> 
        <p id="product" /> 
    </div> 
</body> 
</html>

為了獲得一個產品列表,發送一個HTTP GET請求“/ API /Products”。你可以用jQuery做如下:

 $(document).ready(function () {
                //發送一個AJAX請求
                $.getJSON("api/products/", function (data) {
                    //OK,則展示所有商品列表
                    $.each(data, function (key, val) {
                        //格式顯示文本
                        var str = val.Name + ': $' + val.Price;
                        //添加一個商品到列表
                        $('<li/>', { html: str }).appendTo($('#products'));
                    });
                });
            });

getJSON函數發送Ajax請求。響應將是一個JSON對象的數組。getJSON的第二個參數是請求成功完成時調用的回調函數。

我們可以發送一個HTTP GET請求“/ API /Products/ ID “,其中ID是Product ID。具體如下:

function find() {
                var id = $('#prodId').val();
                $.getJSON("api/products/" + id,
                function (data) {
                    var str = data.Name + ': $' + data.Price;
                    $('#product').html(str);
                })
            .fail(
                function (jqXHR, textStatus, err) {
                    $('#product').html('Error: ' + err);
                });
        }      

下面的代碼顯示完整Index.cshtml文件。具體代碼如下:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>ASP.NET Web API</title> 
    <script src="http://www.cnblogs.com/Scripts/jquery-1.6.2.min.js"  
        type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                //發送一個AJAX請求
                $.getJSON("api/products/", function (data) {
                    //OK,則展示所有商品列表
                    $.each(data, function (key, val) {
                        //格式顯示文本
                        var str = val.Name + ': $' + val.Price;
                        //添加一個商品到列表
                        $('<li/>', { html: str }).appendTo($('#products'));
                    });
                });
            });

             function find() {
                var id = $('#prodId').val();
                $.getJSON("api/products/" + id,
                function (data) {
                    var str = data.Name + ': $' + data.Price;
                    $('#product').html(str);
                })
            .fail(
                function (jqXHR, textStatus, err) {
                    $('#product').html('Error: ' + err);
                });
        }      
        </script>
</head> 
<body> 
    <div> 
        <h1>All Products</h1> 
        <ul id='products' /> 
    </div> 
    <div> 
        <label for="prodId">ID:</label> 
        <input type="text" id="prodId" size="5"/> 
        <input type="button" value="Search" onclick="find();" /> 
        <p id="product" /> 
    </div> 
</body> 
</html>

運行我們的程序,結果如下圖6-9.

圖6.圖7.圖8.圖9.

雖然十分丑陋,但是終究還是出來了。OK,今天就先了解這么些,后續繼續學習。文章那里要是有描述錯誤還是不對的地方,還請前輩們多多批評指教,大家共同學習,進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM