Trong thế giới của các API, một số ứng dụng tạo ra API, một số ứng dụng khác sử dụng API (gọi API). Khi viết một phần mềm ứng dụng, nhà phát triển sẽ viết một số mã nguồn (source code), nhưng thông thường thì nhà phát triển có thể làm rất nhiều việc bằng cách tìm kiếm và sử dụng các API. Kết quả là, phần lớn các phần mềm hiện đại sử dụng API cùng với các thư viện có sẵn. Nói cách khác, phần mềm được xây dựng (build) từ các thư viện API.
REST-Based (RESTful) APIs
REST API tuân theo một bộ quy tắc nền tảng của kiến trúc REST. Đầu tiên, theo nghĩa đen, REST API bao gồm sáu thuộc tính được định nghĩa. Sáu thuộc tính đó là
Kiến trúc máy khách / máy chủ
Giống như nhiều mô hình ứng dụng, kiến trúc REST sử dụng một mô hình kiến trúc client-server. Đầu tiên, một ứng dụng nhà phát triển tạo REST API và ứng dụng đó, khi thực thi, hoạt động như một máy chủ REST (REST API server). Bất kỳ khác ứng dụng có thể thực hiện cuộc gọi REST API bằng cách thực thi một số mã gây ra yêu cầu từ máy khách đến máy chủ.
Ví dụ, trong hình dưới đây:
1. Máy khách REST client ở bên trái thực hiện lệnh gọi REST API, tạo ra một thông điệp được gửi đến máy chủ REST.
2. Máy chủ REST ở bên phải có mã API xem xét yêu cầu và quyết định cách trả lời.
3. Máy chủ REST gửi lại thông điệp trả lời phù hợp với biến dữ liệu.
Hình Hoạt động của Máy khách / Máy chủ với REST
Hoạt động phi trạng thái (stateless)
Thuộc tính phi trạng thái của REST API có nghĩa là REST không ghi lại và sử dụng thông tin về một API trao đổi cho API tiếp theo. Nói cách khác, mỗi API yêu cầu và trả lời không sử dụng bất kỳ lịch sử quá khứ nào khác xem xét khi xử lý yêu cầu. Để so sánh, giao thức TCP sử dụng stateful, trong khi UDP sử dụng hoạt động stateless.
Có thể lưu cache (hoặc không)
Để đánh giá ý nghĩa của bộ nhớ cache, hãy xem xét những gì xảy ra khi bạn duyệt một trang web. Khi bạn trình duyệt tải một trang web mới, bản thân trang chứa một nhiều đối tượng (văn bản, hình ảnh, video, âm thanh). Một số đối tượng hiếm khi thay đổi, vì vậy sẽ tốt hơn để tải đối tượng một lần và không tải lại; trong trong trường hợp đó, máy chủ đánh dấu đối tượng đó là bộ nhớ cache.
Ví dụ, logo hoặc hình ảnh khác được hiển thị trên nhiều trang của một trang web sẽ gần như không bao giờ thay đổi và có khả năng được lưu trữ. Tuy nhiên, danh sách sản phẩm được trả lại trong của bạn tìm kiếm gần đây nhất của trang web sẽ không được có thể lưu trong bộ nhớ cache vì máy chủ muốn cập nhật và cung cấp một danh sách mới mỗi khi bạn yêu cầu trang.
REST API yêu cầu mọi tài nguyên được yêu cầu thông qua một lời gọi API có một phương thức rõ ràng để đánh dấu tài nguyên như bộ nhớ cache hay không. Các mục tiêu vẫn là tương tự: cải thiện hiệu suất bằng cách lấy tài nguyên ít hơn thường (lưu trữ). Lưu ý rằng tài nguyên có thể lưu trong bộ nhớ cache là được đánh dấu bằng khung thời gian để khách hàng biết khi nào yêu cầu một bản sao mới của tài nguyên một lần nữa.
Biến đơn giản
Trong lập trình, một biến là một tên hoặc nhãn có một giá trị được gán. Để có được hiểu biết chung cho biến lập trình, bạn có thể nghĩ về biến như các biến từ phương trình đại số.Ví dụ 18-1 cho thấy một số mẫu biến các loại khác nhau trong một chương trình Python (Python ngôn ngữ là ngôn ngữ phổ biến nhất hiện nay để viết ứng dụng tự động hóa mạng). Chương trình này bắt đầu với một nhận xét (ba dòng trên cùng với ba đơn dấu ngoặc kép) và sau đó tạo bốn biến, gán chúng đến các giá trị khác nhau và in một dòng đầu ra: sản phẩm là -12.
Ví dụ 18-1 Chương trình Python đơn giản cho thấy một Sản phẩm
Các biến trong ví dụ 18-1 có thể được gọi là đơn giản biến vì mỗi tên biến có một giá trị duy nhất Liên kết với nó. Biến đơn giản có một biến Tên và một giá trị liên quan, vì vậy chúng có một đơn giản kết cấu. Các loại giá trị của chúng tôi có thể có nhiều như là một trong những ví dụ 18-1. Ví dụ bao gồm các phần mềm
Số nguyên không dấu (x)
Số nguyên đã ký (y)
Số dấu phẩy động (z)
Văn bản (tiêu đề)
Danh sách và từ điển biến
Trong khi các biến đơn giản có nhiều công dụng tuyệt vời, các chương trình cần có cấu trúc dữ liệu phức tạp hơn. Trong lập trình, cấu trúc dữ liệu xác định một tập hợp liên quan các biến và giá trị. Chẳng hạn, Python sử dụng danh sách các biến để một tên biến được gán một giá trị đó là một danh sách các giá trị chứ không phải là một giá trị. Bạn có thể tưởng tượng rằng một chương trình tự động hóa mạng có thể muốn có danh sách, chẳng hạn như danh sách các thiết bị được quản lý, danh sách các giao diện trên thiết bị hoặc danh sách cài đặt cấu hình trên một giao diện. Đầu tiên, hãy xem xét biến có tên list1 trong Ví dụ 18-2; lưu ý rằng các dòng bắt đầu bằng # là nhận xét.
Ví dụ 18-2 Danh sách mẫu và biến từ điển trong Python
Ngay cả khi bạn chưa bao giờ thấy mã Python trước đây, bạn có thể đoán một số ý nghĩa của biến list1. Các mã gán biến list1 cho một giá trị mà chính nó là danh sách ba chuỗi văn bản. Lưu ý rằng danh sách có thể bao gồm văn bản, số nguyên không dấu, số nguyên đã ký, v.v.
Hình 18-2 cho thấy cấu trúc dữ liệu đằng sau biến list1 trong ví dụ 18-2. Biến được gán cho danh sách, với danh sách có ba yếu tố danh sách.
Hình 18-2 Cấu trúc dữ liệu danh sách trong Python
Python hỗ trợ một cấu trúc dữ liệu tương tự được gọi là từ điển. Nếu bạn nghĩ về nội dung của một từ điển đối với ngôn ngữ tiếng Anh, từ điển đó liệt kê một loạt các mục được ghép nối: một thuật ngữ và định nghĩa phù hợp. Với ngôn ngữ lập trình như Python, dữ liệu từ điển cấu trúc cũng liệt kê các mục được ghép nối: các khóa (như thuật ngữ) và các giá trị (như định nghĩa). Hình 18-3 cho thấy cấu trúc của giá trị từ điển đó khớp với dict1 biến ở cuối ví dụ. Lưu ý rằng mỗi khóa và giá trị của nó được gọi là cặp khóa: giá trị.
Hình 18-3 Cấu trúc dữ liệu từ điển trong Python
Cấu trúc dữ liệu có thể trở nên phức tạp hơn. Ngoài ra, cấu trúc dữ liệu có thể được lồng nhau. Chẳng hạn, một giá trị biến đổi có thể là một danh sách, với mỗi phần tử danh sách là một từ điển, với các giá trị trong một số khóa: value cặp là danh sách khác, và như vậy. Ngay bây giờ, hãy chú ý đến thực tế là các chương trình sử dụng các biến đơn giản nhưng cũng sử dụng liệt kê các biến và từ điển để dễ thực hiện hơn các loại logic khác nhau.
REST-Based (RESTful) APIs
REST API tuân theo một bộ quy tắc nền tảng của kiến trúc REST. Đầu tiên, theo nghĩa đen, REST API bao gồm sáu thuộc tính được định nghĩa. Sáu thuộc tính đó là
- Kiến trúc client/server.
- Hoạt động theo không trạng thái (stateless)
- Xóa xác nhận của bộ nhớ cache / không thể lưu trữ
- Giao diện thống nhất
- Lớp
- Mã theo yêu cầu
Kiến trúc máy khách / máy chủ
Giống như nhiều mô hình ứng dụng, kiến trúc REST sử dụng một mô hình kiến trúc client-server. Đầu tiên, một ứng dụng nhà phát triển tạo REST API và ứng dụng đó, khi thực thi, hoạt động như một máy chủ REST (REST API server). Bất kỳ khác ứng dụng có thể thực hiện cuộc gọi REST API bằng cách thực thi một số mã gây ra yêu cầu từ máy khách đến máy chủ.
Ví dụ, trong hình dưới đây:
1. Máy khách REST client ở bên trái thực hiện lệnh gọi REST API, tạo ra một thông điệp được gửi đến máy chủ REST.
2. Máy chủ REST ở bên phải có mã API xem xét yêu cầu và quyết định cách trả lời.
3. Máy chủ REST gửi lại thông điệp trả lời phù hợp với biến dữ liệu.
Hình Hoạt động của Máy khách / Máy chủ với REST
Hoạt động phi trạng thái (stateless)
Thuộc tính phi trạng thái của REST API có nghĩa là REST không ghi lại và sử dụng thông tin về một API trao đổi cho API tiếp theo. Nói cách khác, mỗi API yêu cầu và trả lời không sử dụng bất kỳ lịch sử quá khứ nào khác xem xét khi xử lý yêu cầu. Để so sánh, giao thức TCP sử dụng stateful, trong khi UDP sử dụng hoạt động stateless.
Có thể lưu cache (hoặc không)
Để đánh giá ý nghĩa của bộ nhớ cache, hãy xem xét những gì xảy ra khi bạn duyệt một trang web. Khi bạn trình duyệt tải một trang web mới, bản thân trang chứa một nhiều đối tượng (văn bản, hình ảnh, video, âm thanh). Một số đối tượng hiếm khi thay đổi, vì vậy sẽ tốt hơn để tải đối tượng một lần và không tải lại; trong trong trường hợp đó, máy chủ đánh dấu đối tượng đó là bộ nhớ cache.
Ví dụ, logo hoặc hình ảnh khác được hiển thị trên nhiều trang của một trang web sẽ gần như không bao giờ thay đổi và có khả năng được lưu trữ. Tuy nhiên, danh sách sản phẩm được trả lại trong của bạn tìm kiếm gần đây nhất của trang web sẽ không được có thể lưu trong bộ nhớ cache vì máy chủ muốn cập nhật và cung cấp một danh sách mới mỗi khi bạn yêu cầu trang.
REST API yêu cầu mọi tài nguyên được yêu cầu thông qua một lời gọi API có một phương thức rõ ràng để đánh dấu tài nguyên như bộ nhớ cache hay không. Các mục tiêu vẫn là tương tự: cải thiện hiệu suất bằng cách lấy tài nguyên ít hơn thường (lưu trữ). Lưu ý rằng tài nguyên có thể lưu trong bộ nhớ cache là được đánh dấu bằng khung thời gian để khách hàng biết khi nào yêu cầu một bản sao mới của tài nguyên một lần nữa.
Biến đơn giản
Trong lập trình, một biến là một tên hoặc nhãn có một giá trị được gán. Để có được hiểu biết chung cho biến lập trình, bạn có thể nghĩ về biến như các biến từ phương trình đại số.Ví dụ 18-1 cho thấy một số mẫu biến các loại khác nhau trong một chương trình Python (Python ngôn ngữ là ngôn ngữ phổ biến nhất hiện nay để viết ứng dụng tự động hóa mạng). Chương trình này bắt đầu với một nhận xét (ba dòng trên cùng với ba đơn dấu ngoặc kép) và sau đó tạo bốn biến, gán chúng đến các giá trị khác nhau và in một dòng đầu ra: sản phẩm là -12.
Ví dụ 18-1 Chương trình Python đơn giản cho thấy một Sản phẩm
Các biến trong ví dụ 18-1 có thể được gọi là đơn giản biến vì mỗi tên biến có một giá trị duy nhất Liên kết với nó. Biến đơn giản có một biến Tên và một giá trị liên quan, vì vậy chúng có một đơn giản kết cấu. Các loại giá trị của chúng tôi có thể có nhiều như là một trong những ví dụ 18-1. Ví dụ bao gồm các phần mềm
Số nguyên không dấu (x)
Số nguyên đã ký (y)
Số dấu phẩy động (z)
Văn bản (tiêu đề)
Danh sách và từ điển biến
Trong khi các biến đơn giản có nhiều công dụng tuyệt vời, các chương trình cần có cấu trúc dữ liệu phức tạp hơn. Trong lập trình, cấu trúc dữ liệu xác định một tập hợp liên quan các biến và giá trị. Chẳng hạn, Python sử dụng danh sách các biến để một tên biến được gán một giá trị đó là một danh sách các giá trị chứ không phải là một giá trị. Bạn có thể tưởng tượng rằng một chương trình tự động hóa mạng có thể muốn có danh sách, chẳng hạn như danh sách các thiết bị được quản lý, danh sách các giao diện trên thiết bị hoặc danh sách cài đặt cấu hình trên một giao diện. Đầu tiên, hãy xem xét biến có tên list1 trong Ví dụ 18-2; lưu ý rằng các dòng bắt đầu bằng # là nhận xét.
Ví dụ 18-2 Danh sách mẫu và biến từ điển trong Python
Ngay cả khi bạn chưa bao giờ thấy mã Python trước đây, bạn có thể đoán một số ý nghĩa của biến list1. Các mã gán biến list1 cho một giá trị mà chính nó là danh sách ba chuỗi văn bản. Lưu ý rằng danh sách có thể bao gồm văn bản, số nguyên không dấu, số nguyên đã ký, v.v.
Hình 18-2 cho thấy cấu trúc dữ liệu đằng sau biến list1 trong ví dụ 18-2. Biến được gán cho danh sách, với danh sách có ba yếu tố danh sách.
Hình 18-2 Cấu trúc dữ liệu danh sách trong Python
Python hỗ trợ một cấu trúc dữ liệu tương tự được gọi là từ điển. Nếu bạn nghĩ về nội dung của một từ điển đối với ngôn ngữ tiếng Anh, từ điển đó liệt kê một loạt các mục được ghép nối: một thuật ngữ và định nghĩa phù hợp. Với ngôn ngữ lập trình như Python, dữ liệu từ điển cấu trúc cũng liệt kê các mục được ghép nối: các khóa (như thuật ngữ) và các giá trị (như định nghĩa). Hình 18-3 cho thấy cấu trúc của giá trị từ điển đó khớp với dict1 biến ở cuối ví dụ. Lưu ý rằng mỗi khóa và giá trị của nó được gọi là cặp khóa: giá trị.
Hình 18-3 Cấu trúc dữ liệu từ điển trong Python
Cấu trúc dữ liệu có thể trở nên phức tạp hơn. Ngoài ra, cấu trúc dữ liệu có thể được lồng nhau. Chẳng hạn, một giá trị biến đổi có thể là một danh sách, với mỗi phần tử danh sách là một từ điển, với các giá trị trong một số khóa: value cặp là danh sách khác, và như vậy. Ngay bây giờ, hãy chú ý đến thực tế là các chương trình sử dụng các biến đơn giản nhưng cũng sử dụng liệt kê các biến và từ điển để dễ thực hiện hơn các loại logic khác nhau.