Là một nền tảng dành cho việc xây dựng các dịch vụ (services).Phục vụ việc giao tiếp giữa các thiết bị khác nhau(bởi dữ liệu dạng json, xml),vd: chương trình client server giữa máy tính và thiết bị di động
1/ Xây dựng ứng dụng webapi tên “HelloWebAPI”
2/Add Model
ASP.NET Web API có thể kết xuất model thành JSON, XML hoặc các định dạng khác, và sau đó ghi dữ liệu đã kết xuất vào nội dung của thông điệp HTTP respone. Và trình khác sẽ đọc và chuyển lại thành đối tượng. Phần lớn các trình khác sẽ hiểu được XML và JSON.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="hljs-keyword">namespace</span> <span class="hljs-title">HelloWebAPI.Models</span> { <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Product</span> { <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> Id { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Name { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">decimal</span> Price { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } } } } |
3/ Add ApiController
Controller là đối tượng xử lý các HTTP request được gởi lên bởi trình khách. Khi dự án được tạo ra thì đã có sẵn hai controller cho bạn đó là HomeController và ValuesController.
HomeController là một controller truyền thống của ASP.NET MVC, nó có nhiệm vụ trả về các trang HTML khi có yêu cầu, và tất nhiên nó không có mối liên hệ trực tiếp với API Controller. Sự khác biết chính mà bạn thấy đó là các action trên Web API Controller không trả về các views, mà chúng chỉ trả về dữ liệu đơn thuần.
Hãy đổi tên ValuesController thành tên ProductsController. Khi bạn đổi tên Visual Studio sẽ đi tìm những vị trí có tham chiếu đến ValuesController và cập nhật lại để ứng dụng có thể dạy được.
Tiếp theo bạn xóa hết các phương thức trong ProductController và thêm các dòng code sau vào định nghĩa lớp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="hljs-keyword">public</span> IEnumerable<Product> GetAllProducts() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-type">List</span><Product> { <span class="hljs-keyword">new</span> <span class="hljs-type">Product</span>() { Id = <span class="hljs-number">1</span>, Name = <span class="hljs-string">"Gizmo 1"</span>, Price = <span class="hljs-number">1.99</span>M }, <span class="hljs-keyword">new</span> <span class="hljs-type">Product</span>() { Id = <span class="hljs-number">2</span>, Name = <span class="hljs-string">"Gizmo 2"</span>, Price = <span class="hljs-number">2.99</span>M }, <span class="hljs-keyword">new</span> <span class="hljs-type">Product</span>() { Id = <span class="hljs-number">3</span>, Name = <span class="hljs-string">"Gizmo 3"</span>, Price = <span class="hljs-number">3.99</span>M } }; } <span class="hljs-keyword">public</span> Product GetProductById(int id) { <span class="hljs-keyword">if</span> (id < <span class="hljs-number">1</span> || id > <span class="hljs-number">3</span>) { <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-type">HttpResponseException</span>(System.Net.HttpStatusCode.NotFound); } <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-type">Product</span>() { Id = id, Name = <span class="hljs-string">"Gizmo "</span> + id.ToString(), Price = id + <span class="hljs-number">0.99</span>M }; } |
Phương thức GetAllProducts lấy về danh sách của các sản phẩm theo kiểu IEnumerable<Product>. Phương thức GetProductById lấy về sản phẩm theo tham số truyền lên là id của sản phẩm. Khi gọi phương thức GetProductById, nếu Id không tồn tại, thì phương thức sẽ trả về lỗi 404.
4/ Có thể dùng JavaScript và jQuery để gọi service hoặc chương trình trên phone để gọi
Ví dụ cách gọi từ javascript
Để lấy danh sách của sản phẩm, chúng ta cần gởi một HTTP GET request đến “api/products”. Bạn có thể sử dụng jQUery để thực hiện việc đó như dưới đây:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span>></span><span class="javascript"> $(<span class="hljs-built_in">document</span>).ready(<span class="hljs-function"><span class="hljs-keyword">function</span> () </span>{ <span class="hljs-comment">// Send an AJAX request</span> $.getJSON(<span class="hljs-string">"api/products/"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">data</span>) </span>{ <span class="hljs-comment">// On success, 'data' contains a list of products.</span> $.each(data, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">key, val</span>) </span>{ <span class="hljs-comment">// Format the text to display.</span> <span class="hljs-keyword">var</span> str = val.Name + <span class="hljs-string">': $'</span> + val.Price; <span class="hljs-comment">// Add a list item for the product.</span> $(<span class="hljs-string">'<li/>'</span>, { <span class="hljs-attr">html</span>: str }) .appendTo($(<span class="hljs-string">'#products'</span>)); }); }); }); </span><span class="hljs-tag"></<span class="hljs-name">script</span>></span> |
Phương thức getJSON sẽ gởi các AJAX request đến dịch vụ HTTP và nhận được kết quả trả về là một mảng chứa các đối tượng JSON. THam số thứ hai của phương thức getJSON là một phương thức được gọi khi lời gọi đã được đáp trả xong.
Lấy thông tin sản phẩm dựa vào trường ID
Để lấy một sản phẩm dựa vào trường ID, ta cần gởi một request HTTP GET đến “api/products/id” với id chính là mã sản phẩm. Điền đoạn code sau vào mã javascript của Index.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">find</span>() </span>{ <span class="hljs-keyword">var</span> id = $(<span class="hljs-string">'#prodId'</span>).val(); $.getJSON(<span class="hljs-string">"api/products/"</span> + id, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">data</span>) </span>{ <span class="hljs-keyword">var</span> str = data.Name + <span class="hljs-string">': $'</span> + data.Price; $(<span class="hljs-string">'#product'</span>).html(str); }) .fail( <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">jqXHR, textStatus, err</span>) </span>{ $(<span class="hljs-string">'#product'</span>).html(<span class="hljs-string">'Error: '</span> + err); }); } |
Một lần nữa chúng ta lại sử dụng phương thức getJSON của jQuery để gởi các AJAX request, nhưng lần này chúng ta sử dụng trường ID để cấu trúc nên đường dẫn (đích) để gởi request, và kết quả nhận về là dữ liệu JSON của một sản phẩm.
5/ Chạy ứng dụng
Khi chạy ứng dụng, bạn sẽ thấy trang home sẽ có dạng như sau:
Khi bạn gõ ID vào hộp thoại, sau đó nhấn search bạn sẽ được kết quả:
Trong trường hợp ID bạn điền vào không tồn tại, bạn sẽ nhận về một lỗi HTTP 404
6/ Hiểu về Routing
Đối với mỗi thông điệp HTTP, ASP.NET Web API sẽ xác định controller nào sẽ nhận request bằng cách tham khảo (routing table).
Khi tạo một dự án Web API, dự án sẽ tạo ra một tuyến mặc định có dạng như sau:
/api/{controller}/{id}
Trong đó {controller} chính là tên của Controller, phương thức HTTP (GET / POST/ PUT /DELETE) chính là tên của phương thức của controller và {id} sẽ là giá trị gởi lên của tham số có tên là id.
HTTP Method | URI | Action | |
---|---|---|---|
GET | /api/products | GetAllProducts() | |
GET | /api/products/5 | GetProduct(5) | |
POST | /api/products/ | HTTP Status 405 | |
GET | /api/users/ | HTTP Status 404 |
Trên đây là ví dụ về một số request mà chúng ta có thể triệu gọi( thiết bị di động, another computer), trong đó request thứ ba sẽ trả về trạng thái HTTP Status 405, nghĩa là phương thức triệu gọi không được chấp nhận (do controller không có cài đặt phương thức POST). Và request thứ tư sẽ trả về HTTP Status 404 (không tìm thấy tài nguyên).
Kết luận
Qua bài hướng dẫn trên đây, bạn đã phần nào nhận thấy hiệu quả và sự đơn giản của ASP.NET Web API khi cài đặt các HTTP services so với việc sử dụng ASP.NET MVC Controller, và thậm chí nó cũng đơn giản hơn hẳn với việc cài đặt các WCF Services. Và như chúng ta đã biết, HTTP services (RESTFUL) là những dịch vụ mang tính tương thích cao nhất, so với các kiểu dịch vụ khác.
Đạt
CHào bạn. Bạn có thể cho mình xin project mẫu của bạn được không nhỉ?