Tải bản đầy đủ (.docx) (42 trang)

Xây dựng web service dùng API REST ful Service

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.58 MB, 42 trang )

Xây dựng Web Service dùng API REST ful Service
Bài 1: Xây dựng Web Service dùng API RESTful Service
(phần 1)
Trong bài này Tui sẽ trình bày cách tạo web service dùng API RESTful Service, một
nền tảng mới được hỗ trợ từ .net version 4.0 trở lên. Những bạn lập trình về thiết bị
di động cần phải hiểu được các khái niệm cũng như cơ chế vận hành sử dụng API
RESTful, theo Tui thấy nó khá hay và rất tiện lợi trong việc triển khai các dự án liên
quan tới tương tác dữ liệu trên Server.
Trước khi triển khai webservice, các bạn cần đọc và hiểu khái niệm qua 4 mục dưới
đây:

1.

Giới thiệu về ASP.NET Web API

2.

Giới thiệu cơ bản về RESTful Service

3.

Các nguyên tắc cơ bản để tạo ra RESTful Service

4.

Xây dựng Web Service

1.Giới thiệu về ASP.NET Web API
ASP.NET Web API là gì?
Là framework giúp chúng ta tạo ra các Web API – API trên nền web (HTTP).
Web API là các dịch vụ Web (Web service) được xây dựng dựa trên HTTP sử dụng


mô hình lập trình convention (như ASP.NET MVC).

1


Đặc điểm Web API (.NET 4.0 trơ lên)
Giúp cho việc xây dựng các HTTP service rất đơn giản, nhanh chóng




Mã nguồn mở (Open Source) và có thể được sử dụng bởi bất kì client nào hỗ
trợ XML, JSON.



Hỗ trợ đầy đủ các thành phần HTTP: URI, request/response headers, caching,
versioning, content formats.



Có thể host trong ứng dụng hoặc trên IIS.



Kiến trúc lý tưởng cho các thiết bị có băng thông giới hạn như các thiết bị di
động.




Định dạng dữ liệu có thể là JSON, XML hoặc một kiểu dữ liệu bất kỳ.



Làm mới và hiện đại hóa các mẫu dự án mặc định



Mẫu dự án trên điện thoại di động



Nhiều tính năng mới để hỗ trợ các ứng dụng di động



Tùy chỉnh sinh mã(code).



Tăng cường hỗ trợ cho các phương pháp bất đồng bộ



Đọc danh sách đầy đủ tính năng trong các ghi chú phát hành

2


Ưu điểm của Web API



Cấu hình đơn giản hơn nhiều so với WCF.



Hiệu suất(performance) cao.



Hỗ trợ RESTfull đầy đủ.



Hỗ trợ đầy đủ các thành phần MVC như: routing, controller, action result,
filter, model binder, IoC container, dependency injection, unit test, …
Mã nguồn mở (Open source).



2. Giới thiệu cơ bản về RESTful Service
-Là một dịch vụ web đơn giản sử dụng HTTP và tính chất của REST.
-Nó tuân thủ theo 4 nguyên tắc thiết kế cơ bản sau:


Sử dụng các phương thức HTTP một cách rõ ràng



Phi trạng thái




Hiển thị cấu trúc thư mục như URls



Chuyển đổi linh hoạt JavaScript Object Notation (JSON) và XML hoặc cả
hai.
3. Nguyên tắc cơ bản để tạo ra RESTful Service
4 nguyên tắc thiết kế cơ bản sau:
Nguyên tắc 1: Sử dụng các phương thức HTTP một cách rõ ràng
Thiết lập một ánh xạ 1-1 giữa các hành động: tạo, đọc, cập nhật và xoá (CRUD) các
quá trình vận hành và các phương thức HTTP:



POST (HttpPost) – Tạo một tài nguyên trên máy chủ



GET (HttpGet) – Truy xuất một tài nguyên

3




PUT (HttpPut) – Thay đổi trạng thái một tài nguyên hoặc để cập nhật nó




DELETE (HttpDelete) – Huỷ bỏ hoặc xoá một tài nguyên
Nguyên tắc 2: Phi trạng thái
Ta xem mô hình giữa trạng thái và phi trạng thái để dễ so sánh:
Mô hình phi trạng thái:

Mô hình trạng thái:

Nguyên tắc 3: Hiển thị cấu trúc thư mục như URls
Cấu trúc địa chỉ của RESTful service:


Giấu các đuôi tài liệu mở rộng của bản gốc trong máy chủ (.jsp, .php, .asp).



Để mọi thứ là chữ thường (thực ra là không phân biệt, nhưng cũng nên tuân
thủ để khỏi phải nhớ HOA-thường lung tung).



Thay thế các khoảng trống bằng gạch chân hoặc gạch nối (một trong hai loại).



Tránh các chuỗi yêu cầu.

4





Thay vì sử dụng mã (404 Not Found) khi yêu cầu địa chỉ cho một phần đường
dẫn thì luôn luôn cung cấp một trang mặc định hoặc tài nguyên như một phản hồi.
Nguyên tắc 4: Chuyển đổi JavaScript Object Notation (JSON) và XML hoặc cả
hai.
Là một bản tóm tắt các thuộc tính của những thứ trong mô hình dữ liệu hệ



thống.





Định dạng dữ liệu mà ứng dụng và trao đổi dịch vụ trong mức đáp ứng yêu
cầu/ phản hồi hoặc trong phần thân của HTTP.
Các chủ thể trong mô hình dữ liệu có liên quan với nhau.
Cấu trúc dịch vụ sao cho nó tận dụng được phần đầu chấp nhận HTTP có sẵn
bên trong – một loại MIME

4.Xây dựng Web Service
Tui liệt kê các bước tương đối (chi tiết sẽ trình bày trong bài kế tiếp):
Bước 1:
Khởi động Visual Studio → tạo một project ASP.NET Web Application và chọn
template Web API.
Bước 2:
Tạo Data Model sử dụng Entity Framework để Web API service có thể tương tác

CRUD (Create, Read, Update, Delete) dữ liệu được (không tạo cũng được).
Bước 3: Tạo ra các Web API
Nhấp chuột phải vào thư mục Controllers và chọn thêm controller.


Web API 2 Controller Empty: tự viết các phương thức từ đầu.

5




Web API 2 Controller with read/write actions: phát sinh các phương thức
ví dụ để bạn có thể biết cách viết các service này.
Bước 4: Chạy thử và kiểm tra.

Bài kế tiếp Tui sẽ trình bày chi tiết cách tạo Web API service, cách cấu hình cũng
như sử dụng Service.

6


Bài 2: Xây dựng Web Service dùng API RESTful Service
Trong bài này Tui sẽ hướng dẫn chi tiết cách tạo Web API (lý thuyết ở đây), 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:

Các bạn có thể tải SQL Script ở đây để tạo CSDL cho
lẹ: />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:

7


Sau khi chọn
Project, màn hình sau xuất hiện:

Chọ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:

Giờ 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 :

8


Mà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:

(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:


Ta 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:

9


Cả 2 cách cuối cùng cũng trạo được DBFood LINQ như sau:

– 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):

10


Khi khi bấm OK, bạn sẽ thấy Server Explorer có thêm mục sau:

Bạn kéo thả bảng Food vào mục bên phải như hình trên.

11


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):

Sau 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..:


Sau khi bạn chọn Controller… màn hình sau xuất hiện:

12


Ta 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:

Mặ
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:

Tậ
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:

13


Cấ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


using
using
using
using
using
using

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

namespace FoodServer.Controllers
{
public class FoodController : ApiController
{
///
<summary>

14


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

/// 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>
/// <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:

15


“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>

/// tên </param>
/// loại-nhóm</param>
/// đơ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


///
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>

///
///
///
///


name="id">mã food muốn sửa</param>
name="name">tên mới</param>
name="type">loại mới</param>
name="price">giá mới</param>

16


11
12
13
14
15
16

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

/// <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>

/// 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

using System;
using System.Collections.Generic;

17



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

using
using
using
using

System.Linq;
System.Net;
System.Net.Http;

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>
/// <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>

/// tên </param>
/// loại-nhóm</param>
/// đơ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();

18


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

return true;
}
catch
{
return false;
}
}
///
<summary>
/// Dịch vụ chỉnh sửa thông tin
/// </summary>


/// mã food muốn sửa</param>
/// tên mới</param>
/// loại mới</param>
/// 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>


/// 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;
}
}
}

19


105
106
107
108
109
110
111
112
113
114
115

116
117
118
119
120
121
122
123
124

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:

Tại màn hình Properties / chọn
mục Web:

20


Bạ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:

Nế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:

21



Bạn chỉnh lại: http://localhost:8888/api/food để lấy toàn bộ Food:

22


Để lấy 1 Food có mã bất kỳ:
Ví dụ: Lấy Food có mã id=15: http://localhost:8888/api/food/15

23


Hoặc: http://localhost
:8888/api/food?id=15

Ta 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: />
24


Bài 3: Xây dựng Web Service dùng API REST ful Service
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) . Các bạn cần nắm

rõ bài 68 và bài 69 để hiểu và triển khai được Web API RESTful.

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: bạn nhấn Add
to Firefox:

Bạ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:

Bạ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:

25


×