ASP.NET Web API 中文版
前言
HTTP不僅僅服務於web頁面,同時也是構建暴露服務和資料的API的強大平臺。HTTP有著簡單、靈活和無處不在的特點。你能想到的幾乎所有平臺都包含有一個HTTP庫,所以HTTP服務可以遍及廣泛的客戶端,包括瀏覽器、移動裝置和傳統桌面應用程式。
ASP.NET Web API是一個在.NET框架上構建web API的框架。在本教程中,你將使用ASP.NET Web API來建立一個返回產品列表的web API。
建立Web API專案
在本教程中,你將使用ASP.NET Web API來建立一個返回產品列表的web API。前端頁面使用jQuery來顯示結果。
開啟Visual Studio並在開始頁面選擇New Project。或者在File目錄下選擇New,然後選擇Project。
在Template皮膚中,選擇Installed Templates,然後展開Visual C#節點。在Visual C#節點下,選擇Web。在專案模板列表中,選擇ASP.NET Web Application。命名專案為“ProductsApp”並點選OK。
在NEW ASP.NET Project對話方塊中,選擇Empty模板。在”Add folders and core references for”,選中Web API。點選OK。
註釋:你也可以用“Web API”模板來建立Web API。Web API模板使用了ASP.NET MVC來提供API的幫助頁面。我在本教程中使用Empty模板是因為我希望不用MVC來展示Web API。通常,你不必瞭解ASP.NET MVC就能使用Web API。
新增模型
模型是在你的應用程式中表示資料的物件。ASP.NET Web API能夠將你的模型自動序列化成JSON、XML或其他格式,然後將其序列化資料寫入到HTTP響應訊息的body中。只要客戶端能夠讀取序列化格式,它就能夠反序列化出物件。幾乎所有客戶端都能解析XML或JSON。而且,客戶端還能通過在HTTP請求的Accept header中設定來指明它想要的格式。
讓我們來建立一個表示產品的簡單模型吧。
如果Solution Explorer沒有顯示出來,點選View選單,然後選擇Solution Explorer。在Solution Explorer中,右擊Models資料夾。從上下文選單中選擇Add,然後選擇Class。
命名該類為“Product”。新增以下屬性到Product類中。
namespace ProductsApp.Models{ public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } }}
新增控制器
在Web API中,控制器(controller)是處理HTTP請求的物件。我們將新增一個能夠根據ID來返回多個或一個產品的控制器。
備註:如果你還沒有使用過ASP.NET MVC,你應該已經對控制器很熟悉了。Web API的控制器和MVC的控制器很相近,但是它繼承的是ApiController而不是Controller。
在Solution Explorer中,右擊Controllers資料夾。選擇Add,然後選擇Controller。
在Add Scaffold對話方塊中,選擇Web API Controller – Empty。點選Add。
在Add Controller對話方塊,給控制器命名為”ProductsController”。點選Add。
接下來便會在Controllers資料夾下建立一個名為ProductsController.cs的檔案。
備註:其實你不必非得把控制器新增到Controllers資料夾下。資料夾名稱只是為了更方便你組織原始檔。
如果檔案沒有開啟,那就雙擊檔案開啟它。在檔案中替換成以下程式碼:
using ProductsApp.Models;using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Web.Http;namespace ProductsApp.Controllers{ public class ProductsController : ApiController { Product[] products = new Product[] { new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } }; public IEnumerable<Product> GetAllProducts() { return products; } public IHttpActionResult GetProduct(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { return NotFound(); } return Ok(product); } }}
為了讓示例簡單化,products被儲存在控制器類中的固定陣列中。當然,在實際應用程式中,你可能想要查詢資料庫或使用其他外部資料來源。
控制器定義了兩個返回產品的方法:
GetAllProducts方法將整個產品列表作為IEnumerable型別返回。
GetProduct方法通過它的ID來查詢單個產品。
沒錯,你已經有一個可以使用的web API了。控制器上的每個方法都對應一個或多個URI:
Controlle Method
URI
GetAllProducts
/api/products
GetProduct
/api/products/id
對於GetProduct方法,URI中的id是一個佔位符。例如,為了得到一個ID為5的產品,URI是api/products/5。
使用JavaScript和jQuery來呼叫Web API
在本節中,我們將新增一個使用AJAX來呼叫Web API的HTML頁面。我們將使用jQuery來產生AJAX呼叫並用返回結果來更新頁面。
在Solution Explorer中,右擊專案並選擇Add,然後選擇New Item。
在Add New Item對話方塊中,選擇Visual C#下的Web節點,然後選擇HTML Page選項。命名頁面為“index.html”。
用以下程式碼替換檔案中的全部:
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <title>Product App</title></head><body> <div> <h2>All Products</h2> <ul id="products" /> </div> <div> <h2>Search by ID</h2> <input type="text" id="prodId" size="5" /> <input type="button" value="Search" onclick="find();" /> <p id="product" /> </div> <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script> <script> var uri = 'api/products'; $(document).ready(function () { // Send an AJAX request $.getJSON(uri) .done(function (data) { // On success, 'data' contains a list of products. $.each(data, function (key, item) { // Add a list item for the product. $('<li>', { text: formatItem(item) }).appendTo($('#products')); }); }); }); function formatItem(item) { return item.Name + ': $' + item.Price; } function find() { var id = $('#prodId').val(); $.getJSON(uri + '/' + id) .done(function (data) { $('#product').text(formatItem(data)); }) .fail(function (jqXHR, textStatus, err) { $('#product').text('Error: ' + err); }); } </script></body></html>
有好幾個方法去得到jQuery。在本例中,我使用Microsoft Ajax CDN。你也可以在http://jquery.com/下載它,讓ASP.NET “Web API”專案包含jQuery。
得到產品列表
為了得到Products列表,可以傳送一個HTTP的GET請求到“/api/products”。
jQuery的getJSON函式會傳送AJAX請求。其中包含了JSON物件陣列。done函式指定了一個當請求成功時觸發的回撥。在回撥中,我們用產品資訊更新DOM。
$(document).ready(function () { // Send an AJAX request $.getJSON(apiUrl) .done(function (data) { // On success, 'data' contains a list of products. $.each(data, function (key, item) { // Add a list item for the product. $('<li>', { text: formatItem(item) }).appendTo($('#products')); }); });});
通過ID得到產品
如果想要通過ID來取得產品,可以傳送HTTP的GET請求到”/api/products/id“,其中id就是產品的ID。
function find() { var id = $('#prodId').val(); $.getJSON(apiUrl + '/' + id) .done(function (data) { $('#product').text(formatItem(data)); }) .fail(function (jqXHR, textStatus, err) { $('#product').text('Error: ' + err); });}
我們仍然使用getJSON來傳送AJAX請求,但是這次我們將ID放到URI請求中。它的響應會是一個代表了單個產品的JSON物件。
執行應用程式
按F5開始除錯應用程式,web頁面看起來會是下面這樣:
為了通過ID獲得產品,輸入ID並點選Search。
如果你輸入了一個無效的ID,那麼伺服器就會返回HTTP錯誤訊息。
使用F12檢視HTTP請求和響應
當你工作於HTTP服務時,如果能夠檢視HTTP請求和響應的詳細無疑是非常有幫助的。你可以在IE9中使用F12開發者工具來做這些操作。在IE9中,按F12來開啟工具。點選Network皮膚,並點選Start Capturing。現在返回到web頁面,並按F5來重新載入web頁面。IE將會捕捉到瀏覽器和web伺服器之間的HTTP傳輸。下圖顯示了一個頁面的所有HTTP傳輸。
定位到相對URI”api/products/“。選中並點選Go to detailed view。在詳細檢視中,這裡多個皮膚用於檢視請求和響應的header和body。
例如,如果你點選Request headers,你就會看到客戶端在Accept header請求了”application/json“。
如果你點選了Response body,你就會看到產品列表如何被序列化成JSON。其他瀏覽器也有相似的功能。另一個有用的工具是Fiddler,它是一個web除錯代理工具。你可以使用Fiddler來檢視HTTP傳輸,也可以合成HTTP請求,後者能夠給予你在請求上對於HTTP頭部的完全控制。
相關文章
- ASP.NET Web API與Rest web api(一)ASP.NETWebAPIREST
- ASP.NET Web API 特性ASP.NETWebAPI
- ASP.NET Web API 路由ASP.NETWebAPI路由
- 【ASP.NET Web API教程】2 建立各種Web APIASP.NETWebAPI
- 使用ASP.NET Web API構建RESTful APIASP.NETWebAPIREST
- ASP.NET Core Web API 介面限流ASP.NETWebAPI
- ASP.NET Core Web API 與 SSLASP.NETWebAPI
- Web API--入門--(一)ASP.NET Web API 2(C#)入門WebAPIASP.NET
- Asp.Net Web API 2第十課——使用OWIN自承載Web APIASP.NETWebAPI
- ASP.NET Core Web Api之JWT(一)ASP.NETWebAPIJWT
- 讓ASP.NET Web API的Action方法ASP.NETWebAPI
- ASP.NET Core Web API 整合測試ASP.NETWebAPI
- 聊聊asp.net中Web Api的使用ASP.NETWebAPI
- [ASP.NET MVC 小牛之路]18 - Web APIASP.NETMVCWebAPI
- ASP.NET Web API 2 入門教程ASP.NETWebAPI
- ASP.NET Web API實踐系列01,以ASP.NET Web Form方式寄宿ASP.NETWebAPIORM
- JSON Web Token in ASP.NET Web API 2 using OwinJSONWebASP.NETAPI
- 【搬運】ASP.NET Core Web API AttributesASP.NETWebAPI
- ASP.NET Core 1.0開發Web API程式ASP.NETWebAPI
- 使用 ASP.NET Core 和 MongoDB 建立 Web APIASP.NETMongoDBWebAPI
- ASP.NET Web API與Owin OAuth:呼叫與使用者相關的Web APIASP.NETWebAPIOAuth
- Asp.Net Web API 2第十七課——Creating an OData Endpoint in ASP.NET Web API 2(OData終結點)...ASP.NETWebAPI
- ASP.NET Web API 中使用 swagger 來管理 API 文件ASP.NETWebAPISwagger
- ASP.NET Core Web API中使用SwaggerASP.NETWebAPISwagger
- IoC在ASP.NET Web API中的應用ASP.NETWebAPI
- ASP.NET Core Web API 流式返回,逐字顯示ASP.NETWebAPI
- ASP.NET Core Web API 索引 (更新Redis in .NET Core)ASP.NETWebAPI索引Redis
- 簡單的ASP.NET Web API程式碼示例ASP.NETWebAPI
- 使用ASP.NET web API建立REST服務(二)ASP.NETWebAPIREST
- 8 種提升 ASP.NET Web API 效能的方法ASP.NETWebAPI
- ASP.NET Web API 控制器建立過程ASP.NETWebAPI
- 使用 Ninject and ASP.Net Web API 實現Domain EventsASP.NETWebAPIAI
- ASP.NET Core Web API 教程 - Project ConfigurationASP.NETWebAPIProject
- 【ASP.NET Core】體驗一下 Mini Web APIASP.NETWebAPI
- ASP.NET Web API獲取Model後設資料ASP.NETWebAPI
- ASP.NET Web API涉及到的上下文ASP.NETWebAPI
- ASP.NET Web API與Owin OAuth:使用Access Toke呼叫受保護的APIASP.NETWebAPIOAuth
- 舊 WCF 專案成功遷移到 asp.net core web apiASP.NETWebAPI