Thiết kế API REST: Nhiều cuộc gọi so với một cuộc gọi đến API


18

Chúng tôi đang phát triển API nghỉ ngơi cho trang web Thương mại điện tử sẽ được các ứng dụng di động sử dụng.

Trong trang chủ của một ứng dụng, chúng ta cần gọi nhiều tài nguyên như Thanh trượt, Thương hiệu hàng đầu, Sản phẩm bán chạy nhất, Sản phẩm thịnh hành, v.v.

Hai tùy chọn để thực hiện cuộc gọi API:

Cuộc gọi đơn

www.example.com/api/GetAllInHome

Nhiều cuộc gọi:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

Đó là cách tiếp cận tốt nhất cho thiết kế api còn lại - cuộc gọi đơn hoặc nhiều cuộc gọi, giải thích những ưu và nhược điểm?

Mà sẽ mất nhiều thời gian hơn để đáp ứng yêu cầu?

Câu trả lời:


14

Trong Lý thuyết , nhiều cuộc gọi đồng thời linh hoạt hơn và nhanh như vậy.

Tuy nhiên, trong thực tế nếu bạn tải một trang, sau đó tải từng phần của trang đó, hiển thị tải các spinners trên tất cả cho đến khi bạn nhận được kết quả trở lại thì kết quả bị chậm và rời rạc.

Vì lý do này, các yêu cầu dữ liệu AJAX nên được sử dụng một cách tiết kiệm và chỉ khi bạn có một phần của trang tải chậm hoặc cần được làm mới trên một chu kỳ khác với phần còn lại của trang. Nói một màn hình chính / chi tiết, trong đó bạn muốn chọn một tùy chọn từ bản gốc và hiển thị chi tiết tương ứng mà không cần tải lại bản gốc.

Một thiết kế phổ biến là giữ các API riêng biệt để linh hoạt mã hóa và các mối quan tâm về dịch vụ vi mô, nhưng kết hợp phía máy chủ dữ liệu trong trang web. để khách hàng chỉ cần thực hiện một cuộc gọi đến trang web của riêng mình. Các lệnh gọi API với bộ nhớ đệm thích hợp phải nhanh trong trung tâm dữ liệu.

Ngoài ra, hãy cân nhắc việc KHÔNG có các lệnh gọi API khách hàng nào cả. chỉ cần tạo phía máy chủ HTML. Mặc dù các khung ứng dụng trang đơn javascript đẩy bạn xuống tuyến đường api. Nó thường không phải là cách tiếp cận tối ưu cho các trang web thương mại điện tử số lượng lớn.

nhập mô tả hình ảnh ở đây


Cảm ơn, Trên thực tế, api này được sử dụng trong các ứng dụng điện thoại Android và i, tôi muốn biết khi trang chủ ứng dụng được tải, tôi có nên nhận tất cả các tài nguyên như: thanh trượt, nhãn hiệu, sản phẩm trong một cuộc gọi api hoặc gọi riêng cho api cho tài nguyên cá nhân khi người dùng cuộn xuống?
shaijut

Logic tương tự được áp dụng, giảm thiểu các cuộc gọi đồng thời khi không cần thiết. Một ứng dụng cho phép bạn linh hoạt hơn một chút để tải thông tin trong nền. Bạn có thể muốn chuyển sang cách tiếp cận GetChangesSInce (ngày)
Ewan

Vì vậy, bạn kết luận, tốt nhất là nên có một API duy nhất để gọi cho tất cả phản hồi tài nguyên trang chủ cùng một lúc khi trang chủ của ứng dụng tải và có các ứng dụng khác nhau cho thanh trượt, nhãn hiệu, v.v. cho dịch vụ vi mô khi bạn có một phần của trang được cập nhật ?
shaijut

trừ khi bạn có lý do chính đáng tại sao những phần đó không được tải với trang / dữ liệu chính
Ewan

Tôi có câu hỏi cuối cùng làm thế nào các ứng dụng như amazon, flipkart hoạt động? Họ không tải tất cả tài nguyên trang chủ trong một cuộc gọi khi người dùng mở ứng dụng? Tôi muốn biết những gì sẽ là cách tiếp cận tốt nhất về điều này.
shaijut

5

TL; DR: Tất cả các cân nhắc ứng dụng khác sang một bên, thực hiện một cuộc gọi sẽ nhanh hơn thực hiện nhiều cuộc gọi. Chạy các cuộc gọi không đồng bộ có thể cắt giảm tổng thời gian cần thiết để hoàn thành một thao tác nhất định theo quan điểm của người dùng của bạn (có thể là tất cả những gì bạn cần), nhưng tổng hợp, thời gian thực hiện vẫn sẽ lâu hơn cho nhiều cuộc gọi.

Tuy nhiên, trong trường hợp của bạn, tôi không chắc đó là câu chuyện đầy đủ.

API REST là một thuật ngữ hơi mơ hồ, do nhiều cách hiểu khác nhau của bài báo đã khiến ý tưởng trở nên phổ biến. Tuy nhiên, bằng cách giải thích tự do nhất về những gì cấu thành API REST, tuy nhiên, những gì bạn không thực sự phù hợp.

Nguyên tắc cốt lõi là bạn có một tài nguyên mà bạn muốn thực hiện một hành động. URI xác định tài nguyên bạn quan tâm và thông thường bạn sẽ sử dụng các động từ HTTP để chỉ ra những gì bạn muốn làm với tài nguyên đó.

Trong trường hợp cụ thể của bạn, tất cả các phương thức của bạn đều có từ 'get' trong tên của chúng. Bạn nên thay đổi động từ được sử dụng trong yêu cầu HTTP để cho biết rằng bạn muốn 'lấy' tài nguyên có sẵn tại địa điểm đó.

Lược đồ URI của bạn phải thể hiện hệ thống phân cấp logic của các tài nguyên bạn muốn cung cấp cho người dùng API của bạn, vì vậy trong trường hợp của bạn, tôi sẽ cân nhắc sử dụng một cái gì đó như /api/products?category=slidersđể lọc bộ sưu tập sản phẩm của bạn. Điều này có nghĩa là khi khách hàng muốn nhận tất cả các sản phẩm của bạn, họ có thể bỏ qua chuỗi truy vấn.


Cảm ơn, vì vậy, bạn có nghĩa là độc thân urlcho API nhưng yêu cầu nên tạo các tài nguyên khác nhau bằng Chuỗi truy vấn? , Cũng kiểm tra này .
shaijut

Có, việc chạy các cuộc gọi của bạn không đồng bộ sẽ giảm thời gian tuyệt đối cần thiết để tìm nạp dữ liệu, nhưng tổng hợp lại, thời gian thực hiện vẫn sẽ lớn hơn; Nhiều cuộc gọi phải lặp lại chi phí kết nối TCP và chuyến đi khứ hồi. Ngay cả việc sử dụng các tính năng như keep-alivearent sẽ loại bỏ hoàn toàn điều này.
richzilla

Thể loại sẽ là một tài sản của một tài nguyên sản phẩm cá nhân. Theo logic, bạn sẽ tìm nạp bộ sưu tập các sản phẩm và lọc tất cả những sản phẩm có danh mục được chỉ định
richzilla

vậy ý ​​bạn là, khi người dùng mở trang chủ của ứng dụng, một cuộc gọi sẽ đến api trả về tất cả các tài nguyên được đề cập ở trên? hoặc khi anh ta thực hiện các cuộc gọi riêng lẻ nên được thực hiện cho các tài nguyên cụ thể là cách thực hành tốt nhất?
shaijut

Nó phụ thuộc vào những gì người dùng của bạn mong đợi nhìn thấy tại mỗi điểm trong ứng dụng của bạn. Lấy trang web này làm ví dụ, khi bạn nhấp vào questionsbạn sẽ thấy URI là /questions, khi bạn nhấp vào một trong những thẻ yêu thích của bạn, URI là/questions/tagged/<tagname>
richzilla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.