我們在【ASP.NET Web API 心得筆記 (3) CRUD 操作之後端程式】裡完成了整個 CURD 在 ASP.NET Web API 上的討論,但前端網頁要如何呼叫使用 GET, POST, PUT, DELETE 這些資源呢?接下來我們就來討論 CRUD …等在前端網頁如何透過 jQuery 來呼叫使用這些資源。
以下都是純 jQuery 程式碼,也就是說,你可以在任何網頁裡使用它,PHP、JSP、ASP、ASP.NET、ASP.NET MVC … 這樣分離的更清楚,前端開發人員,不用開 Visual Studio,不用會 ASP.NET / ASP.NET MVC,只需要了解你 Web API 的 URI 資源如何取得與使用。
這也表現出另一個 Web API 的優點,RESTful 就是一組透過 URI 來取得與設定資源,以前,或許你會寫 Web Service,WCF,但如果想在單純的 HTML 網頁裡呼叫使用,或在沒有 Visual Studio 工具幫忙下要去使用,還真有些困難。現在,Web API 把問題單純化,你想怎麼用就怎麼用,或更進一步,你想在那裡用就在那裡用。
取得資源
這是最簡單的,一般會有取得全部資料與取得單一資料,這部份我們在「ASP.NET Web API 心得筆記 (1)」已經提供實作程式碼,整理如下:
$(function(){
// 傳送 AJAX 請求
$.getJSON("/api/Products/",
function (data) {
// 成功, data 會包含所有產品列表
$.each(data, function (key, val) {
// 處理回傳資料
});
});
});
function find() {
// 取的輸入的id
var id = $('#prodId').val();
// 傳送 AJAX 請求
$.getJSON("/api/products/" + id,
function (data) {
// 成功, 處理回傳資料
})
.fail( // 失敗
function (jqXHR, textStatus, err) {
// 顯示錯誤訊息
});
}
刪除資源
要刪除一筆資料,通常會傳入一個參數,此參數通常是資料庫裡的主鍵(Primary Key),這裡我們假設主鍵就是 id:
$(function() {
// 頁面上 delete 按鍵加上 click 事件
$("a.delete").live('click', function () {
// 取得 id 值,即PK
var id = $(this).data('contact-id');
$.ajax({
url: "/api/contacts/" + id,
type: 'DELETE', // 重點
cache: false,
statusCode: {
200: function(data) {
// 刪除成功,將 UI 上此筆資料刪除
);
}
}
});
return false;
});
});
注意【type: 'DELETE'】,這樣 jQuery 就會幫我們送出 HTTP DELETE 請求給 Web API,而 Web API 收到 DELETE 請求,會去找 "Delete..." 開頭的 Action 執行刪除動作。
新增與更新資源
新增資料步驟上大致上:
- 取得表單
- 取得要傳送的欄位資料並整理為 Object
- 把 Object 轉換為 JSON 格式
- 透過 jQuery 的 ajax 幫忙傳送資料
$(function () {
// 取得表單
var form = $('#newContactForm');
// 當 form 觸發 submit 時
form.submit(function () {
// 取得欄位資料,整理為 Object
// 以"心得1"資料結構為例
var contact = { Id: 0, Name: $('#name').val(), Price: $('#price').val() };
// Object to JSON
var json = JSON.stringify(contact);
$.ajax({
url: '/api/contacts',
cache: false,
type: 'POST', // 重點
data: json,
contentType: 'application/json; charset=utf-8',
statusCode: {
201 /*Created*/: function (data) {
// 新增成功
}
}
});
return false;
});
});
要注意的地方有二處。
注意 ajax 裡的【type: 'POST'】,jQuery 會幫我們送出 HTTP POST 請求給 Web API,Web API 收到 POST 請求會去找 "Post..." 開頭的 Action 執行。注意 statusCode 的狀態碼是【201 /*Created*/】,而不是只有 【201】。
更新只需把【type: 'PUT'】,其他步驟程式大同小異,這裡有篇【PUT and DELETE with jQuery】把 POST 與 PUT 的 AJAX 寫成擴充函式,有興趣可以去複製來用。
分頁與排序
在【ASP.NET Web API 心得筆記 (5) 分頁和查詢(Paging and Querying)】提到 Web API 的分頁與查詢:
一般使用 LINQ 的分頁與查詢:
$(function () {
// 當按鍵觸發 click 事件
$("#getContactsPaging").click(function () {
// 取得每頁 size
var pageSize = $('#pageSize').val();
// 取得第幾頁
var pageIndex = $('#pageIndex').val();
// 資源
var url = "/api/contacts?pageSize=" + pageSize + '&pageIndex=' + pageIndex;
$.getJSON(url, function (data) {
// 處理取得的 JSON 資料
});
return false;
});
});
這邊我們補上 Web API 的使用 LINQ 的範例程式碼:
''' <summary>
''' 取得連絡人分頁後資料
''' </summary>
''' <param name="pageSize">每頁幾筆</param>
''' <param name="PageIndex">第幾頁</param>
Function GetContacts(pageSize As Integer, PageIndex As Integer) As IEnumerable(Of Contact)
Return _repository.GetAllContact.Skip(PageIndex * pageSize).Take(pageSize)
End Function
使用 Web API 所支援 OData 方式:
$(function () {
// 當按鍵觸發 click 事件
$("#getcontactsQueryable").click(function () {
// 取得每頁 size
var pageSize = $('#pageSize').val();
// 取得第幾頁
var pageIndex = $('#pageIndex').val();
// 資源
// $top : OData 參數,取得前 n 筆
// &skip : OData 參數,跳過前 n 筆
var url = "/api/comments?$top=" + pageSize + '&$skip=' + (pageIndex * pageSize);
$.getJSON(url, function (data) {
// 處理取得的 JSON 資料
});
return false;
});
});
認證(Authorization)處理
你是否發現,Web API 好像沒有什麼安全性,只要我們知道了 URI 及規則後,好像誰都可以使用,要知道 URI 及規則也不是難事,現在瀏覽器的除錯工具都很方便。如果我們希望只有認證過(登入)的使用者/頁面,才能來使用 Web API 服務,也是簡單,只需加上 Authorize 屬性即可。
Imports System.Web.Http
Imports System.Net.Http
Imports System.Net
<Authorize()>
Public Class ContactsController
Inherits ApiController
' ... 略 ...
End Class
前端 jQuery 呼叫時,必須加上狀態碼 401 的處理:
$(function () {
$("#getContactsFormsAuth").click(function () {
$.ajax({ url: "/api/contacts",
accepts: "application/json",
cache: false,
statusCode: {
200: function(data) {
viewModel.comments(data);
},
401: function(jqXHR, textStatus, errorThrown) {
self.location = '/Account/Login/';
}
}
});
});
});
重點在必須加上【401: function(jqXHR, textStatus, errorThrown)】這一段處理,當認證不通過會產生 401 狀態碼,當回應是 401 狀態碼就轉址至登入頁面。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。