Mở đầu
Trong các bài viết trước về chủ đề Web API các bạn đã biết cách tạo và sử dụng Web API service, cũng như cách kiểm nghiệm xem Web API service chạy được hay chưa.
Nếu chưa biết thì các bạn có thể tham khảo lại các bài viết theo link bên dưới:
Trước đây khi sử dụng WCF REST service hoặc Web service thông thường, chúng ta chỉ quan tâm đến các phương thức GET và POST nhưng giờ đây khi sử dụng Web API mọi thứ trông có vẻ phức tạp hơn khi ngoài các HTTP verb GET, POST còn có thêm PUT, DELETE. Vậy tại sao phải quan tâm đến PUT và DELETE và cách sử dụng chúng như thế nào cho đúng trong project Web API? Chúng ta sẽ cùng tìm câu trả lời trong bài viết này.
Giới thiệu về HTTP Verb
Để bắt đầu chúng ta sẽ tìm hiểu HTTP verb là gì? Hiểu đơn giản HTTP verb là một thành phần của request gọi từ client tới server để yêu cầu server thực hiện một việc gì đó như là lấy dữ liệu từ server về, gửi dữ liệu lên server để xử lý, cập nhật hoặc xóa dữ liệu trên server…
Để biết chi tiết hơn các bạn có thể đọc bài viết trên wikipedia về HTTP:
Sử dụng các phương thức theo chuẩn RESTful
Để các web api tuân thủ theo chuẩn restful chúng ta cần sử dụng đúng các HTTP verb tương ứng với ý nghĩa của chúng. Đơn giản có thể hiểu từng HTTP verb tương ứng với một thuật ngữ rất quen thuộc với chúng ta đó là CRUD viết tắt của:
- POST – Create: Tạo dữ liệu mới
- GET – Read: Lấy dữ liệu về
- PUT – Update: Cập nhật dữ liệu
- DELETE – Delete: Xóa dữ liệu
Trong 4 HTTP verb trên mặc dù POST có thể thực hiện tất cả các action nhưng với RESTful service thì cần sử dụng tất cả các verb trên bởi vì:
- 3 verb (GET, PUT, DELETE) được gọi là các phương thức không thay đổi giá trị (idempotent), tức là bạn có thể gọi GET/PUT/DELETE nhiều lần cũng không có lỗi hay gây bất kỳ ảnh hưởng nào đến ứng dụng.
- Nhưng POST lại là một phương thức làm thay đổi giá trị, tức là nếu gọi POST nhiều lần thì sẽ tạo ra nhiều dữ liệu giống nhau.
Vì lý do trên nên việc tuân thủ web api theo chuẩn RESTful khá quan trọng, không tuân thủ cũng được nhưng khi đó rất có thể bạn sẽ nhận được những kết quả không mong muốn như là ví dụ trùng lặp dữ liệu ở trên. Một ví dụ điển hình nữa là nếu dùng GET để thực hiện thêm mới dữ liệu thì khi url được index bởi bộ máy tìm kiếm Google Crawler sẽ dẫn đến GET được thực hiện nhiều lần không kiểm soát được.
Phương thức HTTP mặc định trong Web API
Ở phần trên chúng ta đã tìm hiểu về các HTTP verb theo chuẩn RESTful, bây giờ chúng ta sẽ cùng xem nó áp dụng trong ASP.NET Web API như thế nào? Giả sử chúng ta tạo mới một ASP.NET Web API project với Action như sau, nếu chỉ nhìn vào code bạn có thể đoán đây là một GET action bởi vì nó trả về dữ liệu.
1 2 3 4 5 6 7 8 9 10 11 | public class DefaultController : ApiController { /// <summary> /// Returns all values. /// </summary> /// <returns>String array.</returns> public IHttpActionResult Values() { return Ok(new string[] { "value1", "value2" }); } } |
Chúng ta sẽ sử dụng Fiddler để test thử action này với phương thức GET
Kết quả là chúng ta nhận được lỗi 405 – Method Not Allowed.
Vậy tại sao lại có lỗi này? Câu trả lời chính là do thuật toán tìm phương thức HTTP của ASP.NET Web API cho các action ưu tiên theo thứ tự như sau:
- Nếu action có các attribute như [HttpGet] [HttpPost]… thì nó sẽ chấp nhận các phương thức này
- Nếu tên của action bắt đầu với các từ “Get”, “Post”, “Put”, “Delete”… thì nó cũng sẽ chấp nhận các phương thức này
- Còn nếu không thì phương thức mặc định là POST
Vì vậy chúng ta thấy action demo đang rơi vào trường hợp thứ 3, Values không chứa từ khóa và cũng không có HTTP attribute nên nó chỉ hỗ trợ POST. Chúng ta đổi lại Method POST và test thử
Kết quả dữ liệu đã được trả về nhưng chúng ta lại đang sử dụng phương thức POST, rõ ràng là không theo chuẩn RESTful. Vậy hãy sửa lại tên action bổ sung thêm Get hoặc bổ sung HTTP verb [HttpGet] và kiểm tra lại xem mọi thứ đã như mong muốn hay chưa.
1 2 3 4 5 6 7 8 9 10 11 12 | public class DefaultController : ApiController { /// <summary> /// Returns all values. /// </summary> /// <returns>String array.</returns> [HttpGet] public IHttpActionResult GetValues() { return Ok(new string[] { "value1", "value2" }); } } |
Bây giờ thì dữ liệu đã trả về theo phương thức GET như mong muốn.
Kết luận
Trong bài viết này chúng ta đã cùng tìm hiểu lý do tại sao phải sử dụng đúng các phương thức HTTP GET, POST, PUT, DELETE khi thiết kế các service theo chuẩn RESTful. Chúng ta cũng hiểu các phương thức mặc định của ASP.NET Web API và cách sử dụng các phương thức này cho Web API action như thế nào.
Lời cuối cùng tôi muốn nói đó là: Hãy luôn thiết kế các Web API của bạn tuân thủ theo chuẩn RESTful, sử dụng các phương thức HTTP một cách hợp lý bởi vì nó sẽ quyết định loại phương thức nào client có thể kết nối và sử dụng Web API của bạn, nó sẽ giúp cho các Web API của bạn được trong sáng, thống nhất, tránh được các lỗi không đáng có.
Hy vọng bài viết này sẽ giúp ích cho các bạn trong quá trình xây dựng các Web API của riêng mình. Nếu bạn có bất kì câu hỏi hay kinh nghiệm nào hãy để lại comment bên dưới bài viết và đừng quên chia sẻ cho bạn bè bài viết này nếu thấy hữu ích.
Happy coding. Stay tuned.
P/s: Source code example trong bài các bạn có thể download tại đây: WebAPIHTTPDemo
Hieu says
Ví dụ bạn đưa ra đơn giản quá. Trong thực tế các loại hàm Get trong 1 project khá đa dạng về số lượng và tham số cũng như kiểu trả về. Lúc đó dựa vào đâu để detect ra đúng action vậy bạn?