Thursday, June 22, 2017

Xây dựng Web Service dùng API RESTful Service(phần 4)
Trong bài này Tui sẽ hướng dẫn các bạn từng bước cài đặt lên IIS Server ở máy local của các bạn, việc test trên máy local cũng khá quan trọng vì khi test hoàn chỉnh xong thì ta mới publish ra ngoài.
Dưới đây là chi tiết từng bước cách dựng IIS Server và cách triển khai FoodServer lên IIS này (Tui setup trên Win 10, 64 bit)
Bước 1: Vào Control panel chọn Programs and Features
h71-0Bước 2: Chọn Turn Windows features on or off:
h71-1Bước 3: Tiến hành lựa chọn để cài IIS Web Server theo màn hình dưới đây:
h71-2Sau khi lựa chọn giống như khung khoanh màu đỏ, nhấn OK để tiến hành cài đặt, tùy thuộc vào máy mà chương trình có thể cài từ 5-10 phút.
Bước 4: Sử dụng IIS Web Server:
Sau khi cài xong IIS Web Server, bạn quay lại màn hình Control panel, bạn sẽ thấy Administrative Tools:
h71-3Bạn click vào biểu tượng Administrative Tools, ta có giao diện tiếp theo:
h71-4Bạn chọn “Internet Information Services (IIS) Manager” như hình trên:
h71-5Trong màn hình quản trị bạn thấy có 2 vùng: Application Pools và Default Web site.
Bước 4.1 Cấu hình Application Pools:
Application Pool là gì?
Application Pool có thể chứa một hoặc nhiều ứng dụng và cho phép chúng ta cấu hình cấp độ giữa các ứng dụng web khác nhau. Ví dụ, nếu bạn muốn cô lập tất cả các ứng dụng web chạy trong cùng một máy, bạn có thể làm điều này bằng cách tạo ra Application Pool riêng biệt cho mỗi ứng dụng web và đặt chúng trong Application Pool tương ứng. Bởi vì mỗi Application Pool chạy trong quá trình làm việc riêng của mình, các lỗi trong Application Pool sẽ không ảnh hưởng đến các ứng dụng đang chạy trong Application Pool khác. Triển khai ứng dụng trong Application Pool là lợi thế chính của IIS trong quá trình làm việc ở chế độ cách ly bởi vì bạn có thể tùy chỉnh Application Pool để đạt được cấp độ tách biệt ứng dụng mà bạn cần.
Khi bạn cấu hình Application Pool để sẵn sàng tối ưu, bạn cũng nên xem xét làm thế nào để cấu hình Application Pool bảo mật ứng dụng. Ví dụ, bạn có thể cần phải tạo ra Application Pool riêng cho ứng dụng đòi hỏi mức độ bảo mật cao, trong khi cho phép các ứng dụng đòi hỏi một mức độ thấp hơn của bảo mật để chia sẻ cùng Application Pool.
Bạn bấm chuột phải vào màn hình Application Pools/ chọn Add Application Pool… như hình dưới đây:h71-6Màn hình tạo mới Application Pool hiển thị lên, ta nhập “FoodServer_Pool” rồi bấm OK:
h71-7Sau khi bấm OK, bạn quan sát:
h71-8Ở màn hình trên bạn tiếp tục chọn Advanced Settings.. cho FoodServer_Pool:
h71-9Bạn cần chỉnh ApplicationPoolIdentity qua LocalSystem.
Bước 4.2: Cấu hình WebService lên IIS Server
Bấm chuột phải vào Default Web Site / chọn Add Application …
h71-10
Màn hình hiển thị Add Application:
h71-11Mục Alias (1): Đặt tên cho Service, ở đây ta đặt foodserver
Mục Application pool (2): Nhấn nút Select… và chọn đúng FoodServer_Pool
Mục Physical path (3): Trỏ tới đường dẫn chứa source code của project
Sau đó bấm OK để tạo.
Bạn quan sát kết quả:
h71-12http://localhost/foodserver/api/food chính là kết quả sau khi cấu hình xong. Tới đây hệ thống đã chạy 24/24.
Các bạn có thể dùng Postman và HttpRequester để test HttpPost, HttpGet, HttpPut và HttpDelete.
Các bạn chú ý rằng khi từ Mobile kết nối tới Web Service này thì không thể dùng localhost (vì nó lầm tưởng là của chính mobile), đo dó bạn cần đưa localhost về 1 địa chỉ IP để test.
Cách lấy địa chỉ IP của máy local của ta:
– Nhấn tổ hợp phím có biểu tượng Windows + R để mở cửa sổ Run:
h71-13– gõ lệnh cmd, màn hình command line hiển thị lên, tiếp tục gõ lệnh ipconfig
h71-14Ở trên máy local của Tui có địa chỉ IP: 192.168.100.3
Bây giờ Tui thay thế cho localhost:
h71-15Như vậy ta cũng có được kết quả mong muốn.
Các bạn cố gắng cấu hình để được kết quả như trên.
Bài sau Tui sẽ hướng dẫn cách tương tác từ Mobile Android lên RESTful WebService, các bạn chú ý theo dõi.
Chúc các bạn thành công!
Xây dựng Web Service dùng API RESTful Service(phần 3)
Trong bài này Tui hướng dẫn các bạn cách sử dụng 2 công cụ HttpRequester (firefox addon) và Postman (chrome addon) 
  1. Cách sử dụng HttpRequester.
Bạn mở trình duyệt Firefox, vào google tìm từ khóa “httprequester addon” hoặc vào link: https://addons.mozilla.org/en-US/firefox/addon/httprequester/, bạn nhấn Add to Firefox:
h70-0Bạn tiến hành cài, cài xong khởi động lại trình duyệt Firefox, nhìn vào góc phải trên cùng trình duyệt:
h70-1Bạn bấm vào biểu tượng đó, chương trình HttpRequester sẽ xuất hiện như hình dưới đây:
h70-2Mục URL: Nhập URL Web API của bạn vào (http://localhost:8888/api/food). Bạn nhấn GET, chương trình sẽ lấy toàn bộ danh sách Food vào màn hình bên phải (bạn quan sát sẽ thấy).
Để Test lấy 1 Food theo mã nào đó bạn làm như sau:
h70-3Bạn vào tab Parameters, nhập tên biến + giá trị rồi nhấn Add. Sau đó bấm nút GET để lấy dữ liệu, như bạn quan sát đó Tui nhập id=15 thì chương trình lấy ra được Food “Hột mít vùi tro”.
-Test HTTP POST:
h70-4Đối với POST bạn cũng vào Parameters, nhập đủ parameters (phải giống như viết trong Web API), sau đó nhấn nút “POST”, bạn thấy kết quả trả về là true—> tức là thêm thành công. Bạn có thể test lại chức năng HTTP GET để xem lại kết quả thêm mới này.
Trường hợp PUT tương tự bạn tự làm.
Giờ Tui làm tiếp trường hợp Delete:
h70-5Trong combobox, bạn chọn DELETE, nhập Parameter rồi bấm Submit, thấy kết quả là true==> xóa thành công.
2.Cách sử dụng Postman.
Mở trình duyệt Chrome, tìm từ khóa “postman plugin”, hoặc https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en tiến hành cài đặt, sau khi cài thành công:
h70-6Kích hoạt postman để sử dụng.
Để lấy toàn bộ dữ liệu (HttpGet) ta chọn Get như hình dưới đây:
h70-7Để lấy 1 Food theo mã ta làm theo các bước dưới đây (Ví dụ lấy Food có id=1):h70-8Để sử dụng HttpPost (tạo Food mới) ta làm theo các bước dưới đây:
h70-9Ở trên khi bấm Send, trả về true==> thêm Food thành công.
Để xóa một Food có mã bất kỳ:
h70-10Trên đây là cách sử dụng HttpRequester và Postman, 2 công cụ này rất hiệu quả giúp chúng ta kiểm tra quá trình thực hiện HttpPost,HttpGet,HttpPut,HttpDelete trước khi triển khai vào hệ thống thực.
Chúc các bạn thành công.
Xây dựng Web Service dùng API RESTful Service(phần 2)
Trong bài này Tui sẽ hướng dẫn chi tiết cách tạo Web API, cách cấu hình IIS, cách sử dụng công cụ Postman(với những ai dùng chrome), cách sử dụng HttpRequester (với những ai dùng Firefox). Postman và HttpRequester là một trong những công cụ hiệu quả nhất để TEST coding của ta, nếu code của ta pass qua được công cụ này thì có thể kết luận rằng Webservice của ta chắc chắn hoạt động tốt.
Để cho có cảm giác Tui sẽ tạo một cơ sở dữ liệu SQL Server, WebAPI sẽ tương tác dữ liệu này bằng cách sử dụng LinQ to SQL:
Bước 1: Tạo cơ sở dữ liệu tên “dbFood”, có một bảng “Food” gồm 4 cột (id để auto) như dưới đây:
h69-0Các bạn có thể tải SQL Script ở đây để tạo CSDL cho lẹ: http://www.mediafire.com/download/48dkwoqka2e1w07/dbFood.sql
Bước 2: Tiến hành viết Web API
Để tạo Project sử dụng Web API có nhiều cách tạo, ở đây Tui sử dụng cách đơn giản nhất để các bạn bớt rối.
Từ Visual Studio 2013 vào menu File/chọn new/ chọn Project:
h69-1Sau khi chọn Project, màn hình sau xuất hiện:
h69-2Chọn các cấu hình như trên, đặt tên Project là “FoodServer” rồi nhấn OK.
Project mặc định ban đầu như sau:
h69-3Giờ ta tiến hành tạo LinQ to SQL cho CSDL dbFood để dễ xử lý như sau:
Bấm chuột phải vào Project/ chọn :
h69-4Màn hình tạo tên LINQ to SQL hiển thị lên, ta tạo tên rồi nhấn OK:
h69-5(chú ý đôi khi bạn sẽ không thấy LINQ to SQL Classes ở màn hình này), nếu không thấy thì chọn New Item:
h69-6Ta chọn các mục giống như bên dưới, tìm tới LINQ to SQL Classes rồi đặt tên DBFood tương tự như trên:
h69-7Cả 2 cách cuối cùng cũng trạo được DBFood LINQ như sau:
h69-8– Ta tiến hành cấu hình để kéo Cơ sở dữ liệu vào làm các lớp tương tác:
Bạ mở Server Explorer (vào menu View/Server Explorer), bấm chọn theo các bước như bên dưới (lệ thuộc vào Server của bạn mà chọn Server name, User đăng nhập cho phù hợp):
h69-9Khi khi bấm OK, bạn sẽ thấy Server Explorer có thêm mục sau:
h69-10Bạn kéo thả bảng Food vào mục bên phải như hình trên.
Tiếp theo bạn tạo 1 thư mục (tên gì cũng được), ở đây Tui đặt đại tên Controllers (bấm chuột phải vào Project/chọn Add/chọn New Folder):
h69-11Sau khi thư mục Controllers được tạo ra, bạn bấm chuột phải vào Thư Mục này rồi chọn Add/Controller..:
h69-12Sau khi bạn chọn Controller… màn hình sau xuất hiện:
h69-13Ta chọn Web API 2 Controller – Empty rồi bấm Add, Visual sẽ hiển thị màn hình đặt tên cho Controller:
h69-14Mặc định là chữ Default, bây giờ bạn đổi lại thành Food (thường ta làm API cho bảng nào thì lấy tên bảng đó), đó là lý do vì sao Tui đặt là Food:
h69-15Tập tin FoodController.cs sẽ được tạo ra, nhưng ta chỉ lấy Food(bỏ chữ Controller đằng sau đi) để tương tác (đây là cơ chế hoạt động). Ta xem cấu trúc Controller được tạo ra:
h69-16Cấu trúc có gì?
  • File WebApiConfig.cs được sinh ra trong thư mục App_Start, bạn để ý  routeTemplate: “api/{controller}/{id}”, tức là khi ta dùng thì viết: “api/food” để lấy toàn bộ danh sách, hay “api/food/3” để lấy chi tiết  1 Food có mã là 3.
  • File FoodController.cs kế thừa từ ApiController
Bây giờ ta tiến hành viết các chức năng (viết trong file FoodController.cs) :
  • HttpGet: Truy vấn thông tin
  • HttpPost: Thêm mới thông tin
  • HttpPut: Thay đổi thông tin
  • HttpDelete: Xóa thông tin
Trước tiên ta làm HttpGet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace FoodServer.Controllers
{
public class FoodController : ApiController
{
///
 
<summary>
/// Dịch vụ lấy toàn bộ Food
/// </summary>
 
 
/// <returns></returns>
[HttpGet]
public List<Food> GetFoodLists()
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.ToList();
}
///
 
<summary>
/// Dịch vụ lấy 1 Food theo khóa chính nào đó
/// </summary>
 
 
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Food GetFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
}
}
Chú ý là Web API nó không quan tâm tới tên phương thức (viết tên gì cũng được, nó tự động lấy chính xác Service yêu cầu), (không cho phép trùng tên biến). Ví dụ nếu bạn cố tình tạo thêm 1 hàm:
1
2
3
4
5
6
[HttpGet]
public Food GetFood_test(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
Khi chạy sẽ báo lỗi ngày (vì hệ thống không quan tâm tên hàm), nó thấy 2 biến id giống nhau ở trên 2 hàm nó sẽ không biết dùng cái nào (vì chúng cùng nhóm HttpGet). Cụ thể là lỗi sau:
“Multiple actions were found that match the request: 
GetFood on type FoodServer.Controllers.FoodController
GetFood_test on type FoodServer.Controllers.FoodController”
Tiếp theo ta viết HttpPost (thêm mới):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
///
 
<summary>
/// Dịch vụ này để thêm mới 1 Food, các thông số gửi từ client lên
/// </summary>
 
 
/// <param name="name">tên </param>
/// <param name="type">loại-nhóm</param>
/// <param name="price">đơn giá</param>
/// <returns>true thành công, false thất bại</returns>
[HttpPost]
public bool InsertNewFood(string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
Food food = new Food();
food.name = name;
food.type = type;
food.price = price;
db.Foods.InsertOnSubmit(food);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
Để chỉnh sửa thông tin ta viết HttpPut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
///
 
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>
 
 
/// <param name="id">mã food muốn sửa</param>
/// <param name="name">tên mới</param>
/// <param name="type">loại mới</param>
/// <param name="price">giá mới</param>
/// <returns></returns>
[HttpPut]
public bool UpdateFood(int id,string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x=>x.id==id);
if (food == null) return false;//không tồn tại false
food.name = name;
food.type = type;
food.price = price;
db.SubmitChanges();//xác nhận chỉnh sửa
return true;
}
catch
{
return false;
}
}
Cuối cùng để xóa 1 Food ta viết HttpDelete như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///
 
<summary>
/// Dịch vụ dùng để xóa Food có id
/// </summary>
 
 
/// <param name="id">id muốn xóa</param>
/// <returns></returns>
[HttpDelete]
public bool DeleteFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x => x.id == id);
if (food == null) return false;
db.Foods.DeleteOnSubmit(food);
db.SubmitChanges();
return true;
}
Sau cùng ta có coding tổng hợp của FoodController như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace FoodServer.Controllers
{
public class FoodController : ApiController
{
///
 
<summary>
/// Dịch vụ lấy toàn bộ Food
/// </summary>
 
 
/// <returns></returns>
[HttpGet]
public List<Food> GetFoodLists()
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.ToList();
}
///
 
<summary>
/// Dịch vụ lấy 1 Food theo khóa chính nào đó
/// </summary>
 
 
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Food GetFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
return db.Foods.FirstOrDefault(x => x.id == id);
}
///
 
<summary>
/// Dịch vụ này để thêm mới 1 Food, các thông số gửi từ client lên
/// </summary>
 
 
/// <param name="name">tên </param>
/// <param name="type">loại-nhóm</param>
/// <param name="price">đơn giá</param>
/// <returns>true thành công, false thất bại</returns>
[HttpPost]
public bool InsertNewFood(string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
Food food = new Food();
food.name = name;
food.type = type;
food.price = price;
db.Foods.InsertOnSubmit(food);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
///
 
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>
 
 
/// <param name="id">mã food muốn sửa</param>
/// <param name="name">tên mới</param>
/// <param name="type">loại mới</param>
/// <param name="price">giá mới</param>
/// <returns></returns>
[HttpPut]
public bool UpdateFood(int id,string name,string type,int price)
{
try
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x=>x.id==id);
if (food == null) return false;//không tồn tại false
food.name = name;
food.type = type;
food.price = price;
db.SubmitChanges();//xác nhận chỉnh sửa
return true;
}
catch
{
return false;
}
}
///
 
<summary>
/// Dịch vụ dùng để xóa Food có id
/// </summary>
 
 
/// <param name="id">id muốn xóa</param>
/// <returns></returns>
[HttpDelete]
public bool DeleteFood(int id)
{
DBFoodDataContext db = new DBFoodDataContext();
//lấy food tồn tại ra
Food food = db.Foods.FirstOrDefault(x => x.id == id);
if (food == null) return false;
db.Foods.DeleteOnSubmit(food);
db.SubmitChanges();
return true;
}
}
}
Bây giờ ta tiến hành cấu hình Port để test trên IIS express hoặc bạn cấu hình IIS full. Trong bài này Tui hướng dẫn cách sử dụng IIS Express.
Bạn bấm chuột phải vào FoodServer Project/ chọn Properties:
h69-17Tại màn hình Properties / chọn mục Web:
h69-18Bạn cấu hình như trên, Port tui chỉnh là 8888, bạn chọn Port nào cũng được, nhưng thường là 4 chữ số.
Sau đó bấm Create Virtual Directory:
h69-19Nếu Visual thông báo màn hình trên coi như bạn thành công.
Bây giờ ta thử chức năng HttpGet để lấy toàn bộ Food và lấy 1 Food theo id bất kỳ:
F5 để chạy Project:
h69-20Bạn chỉnh lại: http://localhost:8888/api/food để lấy toàn bộ Food:
h69-21Để lấy 1 Food có mã bất kỳ:
Ví dụ: Lấy Food có mã id=15: http://localhost:8888/api/food/15
h69-23Ta cần phải biết các công cụ để test HttpGet,HttpPost,HttpPut và HttpDelete.
Bài kế tiếp Tui sẽ hướng dẫn cách dùng công cụ Postman và HttpRequester để xử lý 4 tác vụ trên.
Bây giờ các bạn hãy làm theo hướng dẫn này để có thể tạo được 1 Web API hoàn chỉnh, test trước phần HttpGet mà Tui đã trình bày ở trên trước.
Các bạn tải source code FoodServer ở đây: http://www.mediafire.com/download/c24sm4hg19v8grz/FoodServer.rar
Chúc các bạn thành công.