CÁC PHƯƠNG THỨC REST VÀ CÁC TÁC VỤ CRUD
REST là một kiến trúc cho phép các lập trình viên xây dựng các dịch vụ và viết các ứng dụng. Các phần mềm ứng dụng hoạt động theo kiểu RESTful sử dụng các thông điệp HTTP request để thực thi bốn tác vụ CRUD: CREATE, READ, UPDATE và DELETE. Các tác vụ này được dùng phổ biến nhất trong xử lý và thao tác dữ liệu.
Các phương thức có sẵn của giao thức HTTP tương ứng một – một với các tác vụ CRUD như trong hình vẽ bên dưới.
Khảo sát chi tiết về phương thức GET và POST của giao thức HTTP
GET là phương thức phổ biến nhất của HTTP. Một máy client có thể dùng phương thức GET để yêu cầu lấy một tài nguyên từ máy chủ HTTP. Phương thức GET sẽ nạp các thông tin từ máy chủ xuống cho client. Phương thức này không có hiệu ứng phụ, không thay đổi các thông số hệ thống, không tạo ra và cũng không hủy hại bất kỳ dữ liệu gì. Phương thức GET thì hoạt động an toàn và cho dù bạn thực thi phương thức GET này bao nhiêu lần đi nữa, hệ thống bạn đang tương tác vẫn duy trì tình trạng như cũ.
Một thông điệp GET có dạng như sau:
Phương thức POST được dùng để cập nhật thêm các dữ liệu đến máy chủ (ví dụ như dùng để cập nhật một mẫu form hoặc để tải lên một file). Khi chúng ta nhập vào một địa chỉ URL trong một trình duyệt, chúng ta sẽ kích hoạt một yêu cầu GET. Trong khi đó, để kích hoạt phương thức POST, chúng ta có thể dùng một mẫu form HTML với thuộc tính method=“post” hoặc chúng ta tự viết chương trình thực thi phương thức này. Để xác nhận cập nhật dữ liệu vào mẫu form HTML, phương thức POST cũng dùng cấu trúc tương tự như GET. Sự khác nhau nằm ở chổ câu lệnh truy vấn được gửi trong phần thân (body) chứ không nằm ở phía sau của URI.
Các header của HTTP và các thông số đi kèm cho chúng ta biết rất nhiều thông tin, giúp chúng ta theo dõi các vấn đề phát sinh. HTTP header là một phần cơ bản của một tác vụ gọi API và các kết quả trả về của API. Lý do là vì nó giúp hiển thị các dữ liệu metadata đi kèm theo mỗi lần gọi API.
Metadata là loại thông tin cung cấp các thông tin cơ bản về các loại dữ liệu khác, giúp cho việc tìm kiếm và thao tác trên các dữ liệu dễ dàng hơn.
Các headers thường có dạng là một danh sách của các cặp khóa – giá trị mà client và server dùng để truyền thông tin giữa chúng. Các cặp thông tin này bao gồm các tên (có phân biệt chữ thường và chữ hoa), theo sau bởi dấu hai chấm “:” và sau đó là giá trị của chúng. Có hàng tá các loại header khác nhau. Một số được định nghĩa bởi giao thức HTTP, một số khác được định nghĩa bởi các ứng dụng cụ thể. Tuy nhiên dưới đây chỉ trình bày một số loại header phổ biến nhất.
Có bốn kiểu header riêng biệt:
Như vậy, nói một cách đơn giản, HTTP header mang các thông tin về các thành phần sau:
HTTP header cũng mang các thông tin về kiểu kết nối HTTP, proxy…Phần lớn các trường này dùng cho việc quản lý các kết nối giữa một client, một server và proxy. Các header được phân loại như các request header và response headers. Khi máy chủ gửi trả các API response, các response header sẽ được dùng và phải đảm bảo rằng các loại header chính xác đang được sử dụng trong kết quả trả về.
Request Headers
Các request header thường có dạng tên biến:giá trị. Nhiều giá trị có thể được sử dụng, cách nhau bởi dấu phẩy “,”.
request-header-name: request-header-value1, request-headervalue2,
...
Bên dưới là ví dụ của một request header.
Host: myhouse.cisco.com
Connection: Keep-Alive
Accept: image/gif, image/jpeg, */*
Accept-Language: us-en,fr, cn
Response Headers
Response header cũng có dạng tên:giá trị. Cũng giống như request header, nhiều giá trị có thể được chỉ ra như sau:
response-header-name: response-header-value1, response-headervalue2,
...
Dưới đây là ví dụ của một response header:
Content-Type: text/html
Content-Length: 35
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
The response message body contains the resource data requested.
Dưới đây là một số ví dụ của các header kiểu request và response.
Khi chúng ta duyệt web, thỉnh thoảng chúng ta nhận được báo lỗi từ trình duyệt “401 Unauthorized”. Cũng tương tự như vậy khi chúng ta gọi REST API, chúng ta cũng có thể sẽ nhận được các mã do máy chủ gửi về để báo về trạng thái của lần gọi API. Các mã trả về khi chúng ta gọi REST API thì không có gì khác biệt với các mã mà HTTP hay sử dụng.
HTTP response status code là tập hợp các mã dạng số biết trước chỉ ra trạng thái của một thông điệp HTTP request trong response header. Các mã trạng thái được chia thành năm nhóm theo chức năng.
Dưới đây là một tóm tắt của các nhóm mã trạng thái và một vài mã mà bạn thường gặp khi làm việc với các Web-based API. Một danh sách đầy đủ của những mã trạng thái có sẵn ở RFC7231, mô tả chuẩn HTTP/1.1. Dòng đầu tiên trong thông điệp response (dòng status) sẽ chứa mã trả về từ server. Mã số này là một giá trị có 3 chữ số:
201 (Created): Tài nguyên đã được tạo ra.
204 (No content): Máy chủ đã hoàn tất yêu cầu và phần thân của thông điệp trả lời là trống (empty). Mã 204 hữu ích khi bạn muốn xác nhận rằng một POST request được nhận bởi máy chủ.
301 (Moved Permanently): Hàm gọi request này và tất cả các hàm gọi request trong tương lai nên được điều hướng sang URI khác.
302 (Found): Tài nguyên hiện có đang tạm thời ở địa chỉ URI khác.
304 (Not Modified): Tài nguyên chưa bị thay đổi từ phiên bản chỉ ra trong request header. Mã này hữu ích cho việc giảm phí tổn.
401 (Unauthorized): Thông điệp request cần có một người dùng hợp lệ. Mã này thường có nghĩa là người dùng chưa xác thực hoặc xác thực bị sai.
403 (Forbidden): Yêu cầu là hợp lệ nhưng máy chủ từ chối thực thi. Lý do là người dùng có thể không có đủ quyền truy cập tài nguyên.
404 (Not Found): Máy chủ không tìm thấy bất cứ tài nguyên nào được chỉ ra bởi URI. Không có dấu hiệu nào cho biết trạng thái này là tạm thời hay vĩnh viễn.
501 (Not Implemented): Máy chủ không hỗ trợ chức năng được yêu cầu để hoàn thành.
503 (Service Unavailable): Dịch vụ không thể quản lý yêu cầu này. Nó thường chỉ ra tình trạng tạm thời do máy chủ bị sự cố, đăng bảo trì, bị quá tải…
REST là một kiến trúc cho phép các lập trình viên xây dựng các dịch vụ và viết các ứng dụng. Các phần mềm ứng dụng hoạt động theo kiểu RESTful sử dụng các thông điệp HTTP request để thực thi bốn tác vụ CRUD: CREATE, READ, UPDATE và DELETE. Các tác vụ này được dùng phổ biến nhất trong xử lý và thao tác dữ liệu.
Các phương thức có sẵn của giao thức HTTP tương ứng một – một với các tác vụ CRUD như trong hình vẽ bên dưới.
Khảo sát chi tiết về phương thức GET và POST của giao thức HTTP
GET là phương thức phổ biến nhất của HTTP. Một máy client có thể dùng phương thức GET để yêu cầu lấy một tài nguyên từ máy chủ HTTP. Phương thức GET sẽ nạp các thông tin từ máy chủ xuống cho client. Phương thức này không có hiệu ứng phụ, không thay đổi các thông số hệ thống, không tạo ra và cũng không hủy hại bất kỳ dữ liệu gì. Phương thức GET thì hoạt động an toàn và cho dù bạn thực thi phương thức GET này bao nhiêu lần đi nữa, hệ thống bạn đang tương tác vẫn duy trì tình trạng như cũ.
Một thông điệp GET có dạng như sau:
- GET: Từ khóa GET phải luôn ở dạng chữ in hoa.
- Request URI: Chỉ ra đường dẫn của tài nguyên đang được yêu cầu. Đường dẫn này phải bắt đầu bằng thư mục root /.
- Phiên bản HTTP: Là HTTP/1.0 hoặc HTTP/1.1. Phía client sẽ thỏa thuận phiên bản được dùng cho phiên truy cập hiện tại. Lấy ví dụ, phía client sẽ yêu cầu sử dụng HTTP/1.1. Nếu máy chủ không hỗ trợ HTTP/1.1, máy chủ sẽ thông báo cho phía client dùng HTTP/1.0.
- Tùy chọn request headers: Phía client có thể dùng các header (chẳng hạn như thông số accept hay accept language) để thỏa thuận với phía máy chủ và yêu cầu máy chủ gửi các thông tin mong muốn (ví dụ như ở dạng ngôn ngữ mà phía client mong muốn tiếng Việt hoặc tiếng Anh…)
- Tùy chọn Request body: Các thông điệp GET có một phần tùy chọn là phần thân của request (request body). Phần thân này sẽ chứa câu lệnh truy vấn.
Phương thức POST được dùng để cập nhật thêm các dữ liệu đến máy chủ (ví dụ như dùng để cập nhật một mẫu form hoặc để tải lên một file). Khi chúng ta nhập vào một địa chỉ URL trong một trình duyệt, chúng ta sẽ kích hoạt một yêu cầu GET. Trong khi đó, để kích hoạt phương thức POST, chúng ta có thể dùng một mẫu form HTML với thuộc tính method=“post” hoặc chúng ta tự viết chương trình thực thi phương thức này. Để xác nhận cập nhật dữ liệu vào mẫu form HTML, phương thức POST cũng dùng cấu trúc tương tự như GET. Sự khác nhau nằm ở chổ câu lệnh truy vấn được gửi trong phần thân (body) chứ không nằm ở phía sau của URI.
- POST: Từ khóa POST phải luôn có dạng chữ in hoa.
- Request URI: Chỉ ra tài nguyên đang được yêu cầu. Phần đường dẫn phải bắt đầu bằng thư mục gốc root /.
- Phiên bản HTTP: Có thể là HTTP/1.0 hoặc HTTP/1.1. Phía client sẽ thỏa thuận giao thức được dùng cho phiên truy cập hiện thời. Nếu phía máy chủ không hỗ trợ HTTP/1.1, máy chủ có thể thông báo cho phía client sử dụng HTTP/1.0.
- Tùy chọn Request headers: Phía client có thể dùng các header tùy chọn như kiểu nội dung, chiều dài nội dung (content type, length) để thông báo cho máy chủ HTTP biết.
- Tùy chọn Request body: Một thông điệp POST có thể có một phần thân tùy chọn. Trường này chứa câu lệnh truy vấn.
Các header của HTTP và các thông số đi kèm cho chúng ta biết rất nhiều thông tin, giúp chúng ta theo dõi các vấn đề phát sinh. HTTP header là một phần cơ bản của một tác vụ gọi API và các kết quả trả về của API. Lý do là vì nó giúp hiển thị các dữ liệu metadata đi kèm theo mỗi lần gọi API.
Metadata là loại thông tin cung cấp các thông tin cơ bản về các loại dữ liệu khác, giúp cho việc tìm kiếm và thao tác trên các dữ liệu dễ dàng hơn.
Các headers thường có dạng là một danh sách của các cặp khóa – giá trị mà client và server dùng để truyền thông tin giữa chúng. Các cặp thông tin này bao gồm các tên (có phân biệt chữ thường và chữ hoa), theo sau bởi dấu hai chấm “:” và sau đó là giá trị của chúng. Có hàng tá các loại header khác nhau. Một số được định nghĩa bởi giao thức HTTP, một số khác được định nghĩa bởi các ứng dụng cụ thể. Tuy nhiên dưới đây chỉ trình bày một số loại header phổ biến nhất.
Có bốn kiểu header riêng biệt:
- Các header dạng tổng quát: Các header dạng này không dùng cụ thể cho bất kỳ loại thông điệp nào. Thường được dùng để truyền các thông tin về các thông điệp và làm thế nào để xử lý. Phần Cache-Control của header chỉ ra các thông số cho quá trình cache. Phần kết nối Connection định nghĩa tính thường trực của kết nối. Trường Date là nhãn thời gian.
- Request headers: Header này mang các thông tin về các loại tài nguyên sẽ được nạp. Nó cũng chứa các thông tin về client. Trường Accept-(*) là một tập con của header, định nghĩa các định dạng cho các thông điệp trả lời. Phần Authorization thường chứa dạng mã hóa Base64 của thông tin xác thực bao gồm tên người dùng và mật khẩu, được xác thực trong kiểu xác thực cơ bản. Trường cookie chứa một danh sách các cặp khóa- giá trị chứa các thông tin về phiên hiện hành, người dùng, các hoạt động của trình duyệt và các thông tin trạng thái khác. Trường host được dùng để chỉ ra địa chỉ Internet host và cổng của tài nguyên yêu cầu. Trường host này là bắt buộc phải có trong request header. Trường User-Agent chứa các thông tin về người dùng khởi tạo ra các yêu cầu.
- Response headers: chứa các thông tin về thông điệp trả lời từ server. Trường Age mang thông tin về khoảng thời gian từ khi thông điệp response được tạo ra. Trường Location dùng để điều hướng client đến một vị trí khác với URI ban đầu. Trường server chứa các thông tin về phần mềm được dùng bởi server ban đầu để quản lý các yêu cầu. Trường Set-Cookie được dùng để gửi các cookie từ máy chủ đến máy client. Chứa một danh ách của các cặp khóa-giá trị, được gọi là cookies.
- Entity headers: chứa thông tin về phần thân của thông điệp. Trường Allow liệt kê các phương thức được hỗ trợ, được xác định bởi các tài nguyên được yêu cầu. Trường Content-Type chỉ ra kiểu phương tiện của phần thân (còn gọi là Multipurpose Internet Mail Extensions [MIME]), được gửi tới nơi nhận. Được dùng cho quá trình thỏa thuận định dạng nội dung. Trường Content_Language mô tả ngôn ngữ được dùng. Trường Content-Length chỉ ra kích thước của phần thân. Trường Content-Location được dùng để chỉ ra vị trí của tài nguyên, từ một nơi khác với URI. Trường Expires chỉ ra thời gian datetime mà thông điệp trả lời không còn giá trị. Trường Last-Modified chỉ ra thời gian mà server ban đầu tin rằng các biến được thay đổi.
Như vậy, nói một cách đơn giản, HTTP header mang các thông tin về các thành phần sau:
- Phần thân của thông điệp Request và Response.
- Phần phân quyền của thông điệp request.
- Response caching
- Response cookies
HTTP header cũng mang các thông tin về kiểu kết nối HTTP, proxy…Phần lớn các trường này dùng cho việc quản lý các kết nối giữa một client, một server và proxy. Các header được phân loại như các request header và response headers. Khi máy chủ gửi trả các API response, các response header sẽ được dùng và phải đảm bảo rằng các loại header chính xác đang được sử dụng trong kết quả trả về.
Request Headers
Các request header thường có dạng tên biến:giá trị. Nhiều giá trị có thể được sử dụng, cách nhau bởi dấu phẩy “,”.
request-header-name: request-header-value1, request-headervalue2,
...
Bên dưới là ví dụ của một request header.
Host: myhouse.cisco.com
Connection: Keep-Alive
Accept: image/gif, image/jpeg, */*
Accept-Language: us-en,fr, cn
Response Headers
Response header cũng có dạng tên:giá trị. Cũng giống như request header, nhiều giá trị có thể được chỉ ra như sau:
response-header-name: response-header-value1, response-headervalue2,
...
Dưới đây là ví dụ của một response header:
Content-Type: text/html
Content-Length: 35
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
The response message body contains the resource data requested.
Dưới đây là một số ví dụ của các header kiểu request và response.
- Authorization: mang các thông tin mà client dùng để xác thực khi truy cập tài nguyên.
- WWW-Authenticate: Trường này được gửi bởi máy chủ nếu nó cần một hình thức xác thực trước khi server trả về tài nguyên đang được yêu cầu. Trường này thường được gửi cùng với mã 401, có nghĩa là “unauthorized.”
- Accept-Charset: Kiểu header này báo cho server loại ngôn ngữ nào được chấp nhận bởi client.
- Content-Type: Trường này chỉ ra kiểu media type (text/HTML hay JSON), giúp cho server xử lý phần thân (body) chính xác.
- Cache-Control: Trường này là chính sách định nghĩa bởi server. Đối với loại header response này, một cache response có thể được lưu trữ bởi phía client và sử dụng lại cho tới khi thời gian được chỉ ra trong trường Cache-Control là hết.
Khi chúng ta duyệt web, thỉnh thoảng chúng ta nhận được báo lỗi từ trình duyệt “401 Unauthorized”. Cũng tương tự như vậy khi chúng ta gọi REST API, chúng ta cũng có thể sẽ nhận được các mã do máy chủ gửi về để báo về trạng thái của lần gọi API. Các mã trả về khi chúng ta gọi REST API thì không có gì khác biệt với các mã mà HTTP hay sử dụng.
HTTP response status code là tập hợp các mã dạng số biết trước chỉ ra trạng thái của một thông điệp HTTP request trong response header. Các mã trạng thái được chia thành năm nhóm theo chức năng.
Dưới đây là một tóm tắt của các nhóm mã trạng thái và một vài mã mà bạn thường gặp khi làm việc với các Web-based API. Một danh sách đầy đủ của những mã trạng thái có sẵn ở RFC7231, mô tả chuẩn HTTP/1.1. Dòng đầu tiên trong thông điệp response (dòng status) sẽ chứa mã trả về từ server. Mã số này là một giá trị có 3 chữ số:
- 1xx (thông tin): Thông điệp yêu cầu đã nhận được thành công. Máy chủ đang tiếp tục xử lý. Nó thường có nghĩa là các bước xử lý đăng được thực hiện và chờ cho kết quả sau cũng. Mã này hiếm khi sử dụng.
- 2xx (thành công): thông điệp yêu cầu đã được máy chủ nhận, đã hiểu và đã thực hiện.
201 (Created): Tài nguyên đã được tạo ra.
204 (No content): Máy chủ đã hoàn tất yêu cầu và phần thân của thông điệp trả lời là trống (empty). Mã 204 hữu ích khi bạn muốn xác nhận rằng một POST request được nhận bởi máy chủ.
- 3xx (điều hướng): Các hành động tiếp theo phải được thực thi để hoàn thành tác vụ yêu cầu.
301 (Moved Permanently): Hàm gọi request này và tất cả các hàm gọi request trong tương lai nên được điều hướng sang URI khác.
302 (Found): Tài nguyên hiện có đang tạm thời ở địa chỉ URI khác.
304 (Not Modified): Tài nguyên chưa bị thay đổi từ phiên bản chỉ ra trong request header. Mã này hữu ích cho việc giảm phí tổn.
- 4xx (lỗi ở phía client): Yêu cầu không thể được hiểu hay tài nguyên đang yêu cầu không thể tìm thấy.
401 (Unauthorized): Thông điệp request cần có một người dùng hợp lệ. Mã này thường có nghĩa là người dùng chưa xác thực hoặc xác thực bị sai.
403 (Forbidden): Yêu cầu là hợp lệ nhưng máy chủ từ chối thực thi. Lý do là người dùng có thể không có đủ quyền truy cập tài nguyên.
404 (Not Found): Máy chủ không tìm thấy bất cứ tài nguyên nào được chỉ ra bởi URI. Không có dấu hiệu nào cho biết trạng thái này là tạm thời hay vĩnh viễn.
- 5xx (lỗi ở phía máy chủ): Máy chủ không thể thực hiện yêu cầu từ client.
501 (Not Implemented): Máy chủ không hỗ trợ chức năng được yêu cầu để hoàn thành.
503 (Service Unavailable): Dịch vụ không thể quản lý yêu cầu này. Nó thường chỉ ra tình trạng tạm thời do máy chủ bị sự cố, đăng bảo trì, bị quá tải…