API còn lại - những thách thức cụ thể trên thiết bị di động


25

Tôi đang làm việc trên một dự án ứng dụng iOS mới, về phía di động. Một số thay đổi kiến ​​trúc đang diễn ra và hóa ra chúng ta sẽ phải dựa vào API riêng được xây dựng tùy chỉnh sẽ được sử dụng bởi ứng dụng chúng ta đang xây dựng và cả các khách hàng khác như trang web.

API đang được thiết kế tuân theo kiểu Phần còn lại của các hoạt động URI và CRUD tập trung vào tài nguyên được ánh xạ tới các động từ HTTP. những thứ như:

GET www.example.com/books
DELETE www.example.com/books/482094
POST www.example.com/users/6793

Vấn đề là phong cách này thường dẫn đến nhu cầu máy khách di động thực hiện nhiều yêu cầu tải một màn hình ứng dụng hoặc quản lý một hành động UI người dùng. Điều này dẫn đến ứng dụng ở chế độ tải trong 8 giây cho đến khi ứng dụng có mọi thứ cần thiết. Một ứng dụng chậm và không phản hồi.

Các máy khách di động có những hạn chế nghiêm trọng khi nói đến kết nối và lý tưởng nhất là chúng ta nên tuân theo quy tắc đó:

1 màn hình == 1 cuộc gọi API

1 lưu == 1 lệnh gọi API.

Có nhiều tình huống trong đó điều này đặt bạn vào một khóa học xung đột với các nguyên tắc thiết kế REST, ví dụ:

  • giả sử ứng dụng của bạn đã ngoại tuyến trong một ngày và bạn cần đồng bộ hóa với bốn bảng cơ sở dữ liệu phụ trợ và bạn cần một cuộc gọi như www.example.com/sync_everything?since=2015-07-24
  • giả sử có một màn hình nơi người dùng có thể chỉnh sửa nhiều đối tượng của mình, ví dụ đánh dấu các tác vụ trong danh sách việc cần làm của mình. cần có một cách để chỉnh sửa tất cả các bản ghi tác vụ đó trong một lệnh gọi API hàng loạt thay vì một lệnh gọi API cho mỗi lần chỉnh sửa.
  • giả sử có một màn hình trộn thông tin từ các bảng db ĐẶT HÀNG, SALESMEN và SẢN PHẨM, tôi sẽ nhận được dữ liệu đó trong một cuộc gọi thay vì ba.

rủi ro là chúng ta có thể kết thúc với API yên tĩnh nhất và cũng có ứng dụng di động không phản hồi vô dụng nhất hiện có.

Vấn đề là tôi chỉ là một nhà thầu mới ở đó và những gì tôi cần là thứ giúp tôi đưa ra những quan điểm đó, một số bài viết từ các nguồn được tôn trọng hoặc một cái gì đó tương tự. Những người chơi chính thỏa hiệp với kiểu REST cho ứng dụng khách di động của họ (ví dụ: bằng cách sử dụng điểm cuối API tổng hợp).

Hoặc bất kỳ giải pháp cho vấn đề chung này. Cảm ơn!


3
Có vẻ như câu hỏi của bạn có thể là "Làm thế nào một API có thể phân phối các bộ sưu tập các đối tượng và các đối tượng được nhúng giống hoặc không giống như các kiểu trong khi vẫn giữ kiểu REST?" Tôi có hiểu câu hỏi của bạn không?
ngày

Tôi tin rằng câu trả lời chung là mỗi cuộc gọi REST cần có nhiều tham số tùy chọn để có thể linh hoạt nhưng vẫn tương đối trực quan. Trường hợp đồng bộ hóa sẽ luôn khó khăn, nhưng đối với các trang thông thường, bạn thường nhìn vào một số cuộc gọi cùng loại , tức là tất cả các GET, phải không?
Ixrec

1
Tôi nghĩ rằng việc điều chỉnh API của bạn là giải pháp sai lầm khi vấn đề là thiếu các yêu cầu song song - 8 yêu cầu nhỏ không tệ hơn nhiều so với một yêu cầu lớn khi chúng không phải chờ đợi nhau. Bạn có thể chuyển sang HTTP / 2 không? Hoặc ít nhất là sử dụng đường ống HTTP / 1.1?
amon

Xem thêm: Các mẫu để xử lý các hoạt động hàng loạt trong các dịch vụ web REST? . Khóa này xác định loại lệnh nào (và theo điều kiện tiên quyết nào) có thể được gộp lại với nhau mà không có xung đột, sau đó tạo một biểu diễn JSON của thứ tự được bó, sau đó gửi nó đi. Nó làm mất đi sức hấp dẫn chính của REST, đó là khả năng lưu trữ của nó nhưng khả năng lưu trữ không phải lúc nào cũng phù hợp với tất cả các loại ứng dụng. Lưu ý rằng lô / đồng thời không áp dụng được nếu có phụ thuộc logic.
rwong

Một sự tương tự cho tình huống mà người trung gian cần thực hiện nhiều thao tác theo trình tự, với các phụ thuộc logic không tầm thường trên mỗi hoạt động trước đó, là một cái gì đó giống như "thủ tục được lưu trữ", được thực hiện trong cơ sở dữ liệu đó thay vì bên trong cơ sở dữ liệu. Bên dưới, người trung gian được phép chuyển đổi một lệnh gọi "thủ tục được lưu trữ" thành nhiều yêu cầu RESTful khi cần, nhưng đó là một chi tiết triển khai của người trung gian.
rwong

Câu trả lời:


27

API đang được thiết kế tuân theo kiểu Phần còn lại của các hoạt động URI và CRUD tập trung vào tài nguyên được ánh xạ tới các động từ HTTP.

Đây là vấn đề của bạn ngay tại đây.

Bạn đã giới hạn tài nguyên của mình ở (tôi giả sử) các mô hình trong cơ sở dữ liệu của bạn. Do đó, phải mất nhiều thời gian để tải tất cả các tài nguyên này vì máy chủ của bạn không có khái niệm về tài nguyên không có đại diện trong cơ sở dữ liệu.

Ví dụ có thể có

www.example.com/books/482094
www.example.com/books/582045
www.example.com/books/427454
www.example.com/books/319343

tất cả phải được tải để có được thư viện của tôi

Đây không phải là vấn đề với thiết kế RESTful, đây thực sự là một mẫu chống REST. Hoàn toàn không có gì trong REST nói rằng tài nguyên của chúng ta phải có ánh xạ một đến một với bất kỳ thứ gì khác trong hệ thống của bạn, bao gồm các mô hình cơ sở dữ liệu.

Giải pháp là tạo ra nhiều tài nguyên phù hợp hơn với những gì bạn muốn tải. Nếu bạn có 5 tài nguyên luôn kết thúc với nhau, hãy tạo một tài nguyên mới chứa thông tin cho 5 tài nguyên đó.

Những gì bạn nên có là một cái gì đó như thế này

www.example.com/users/334/my_library

mà chỉ tải tất cả các cuốn sách cho người dùng đó. "My_l Library" không phải là một mô hình trong cơ sở dữ liệu của bạn, nhưng nó là một tài nguyên. Máy chủ tạo nó dựa trên các mô hình trong cơ sở dữ liệu nhưng không có ánh xạ 1 đến 1 và máy chủ có thể linh hoạt để tạo tài nguyên này mà không thay đổi mô hình DB của bạn.

Bạn cũng có thể có

www.example.com/users/334/favioured_books
www.example.com/users/334/books_ordered_last_week
www.example.com/users/334/wishlist

không ai trong số đó phải tồn tại dưới dạng mô hình trong cơ sở dữ liệu hoặc không gian miền của bạn.

Có một quan niệm sai lầm lan rộng rằng đây là điều sai lầm vì các khung như Rails đã dạy mọi người ánh xạ tài nguyên theo kiểu 1 đến 1 cho các mô hình trong không gian miền, ánh xạ lại 1-1 với các hàng cơ sở dữ liệu. Điều này là không cần thiết và cũng không được khuyến khích.

Tài nguyên nên rất nhiều, rẻ và nhẹ . Thật dễ dàng để tạo chúng và chúng nên được trừu tượng hóa từ mô hình miền của bạn. Nếu bạn thấy bạn cần một cái mới, bạn chỉ cần tạo một cái mới. Nếu bạn gặp vấn đề khi thực hiện thì đó là lỗi khung của bạn không phải là lỗi với REST.

Bây giờ, sự cảnh báo lớn với điều đó tất nhiên là liệu khuôn khổ của bạn có cho phép bạn làm điều này hay không. Các khung như Rails và Django đã tham gia khóa học để lập bản đồ 1-1 để "tiết kiệm thời gian của bạn" khiến bạn khó thực hiện điều này. Nhưng đó là một lỗ hổng với các khung công tác, không phải với thiết kế RESTful.

Dưới đây là Jim Webber thảo luận về điều này chi tiết hơn (bao gồm cả một vài cuộc khai quật tại Rails!)

https://yow.eventer.com/yow-2011-1004/domain-driven-design-for-restful-systems-by-jim-webber-1047


Điều này rất thú vị và tôi hoàn toàn đồng ý với điều này nhưng thật đáng buồn, tôi không phải là người làm API và tôi có rất ít cách để tác động đến nó, nếu có. Nhiều người sẽ sử dụng "chống mẫu" đó (vì nhiều lý do, giới hạn khung là một) và họ chỉ sử dụng định nghĩa URI để suy nghĩ rõ ràng về cơ sở dữ liệu của họ. Các điểm cuối API chỉ là một cách khác để trực quan hóa DB của họ ... Ngoài ra, trong một số trường hợp, việc tạo một tài nguyên như tài nguyên mà bạn mô tả là khó khăn do các đối tượng thực tế rất khác nhau, chỉ cần đặt tên cho chúng sẽ dẫn đến các thuật ngữ rất mơ hồ.
MikaelW

Để quay trở lại vấn đề từ góc độ hiệu quả, họ đã đồng ý rằng nếu màn hình di động rất chậm (và chỉ khi điều này xảy ra), sẽ có một số cuộc gọi tổng hợp có thể xảy ra nhưng họ sẽ ngồi trong một thành phần bao quanh API ( thay vì chính API), sẽ chỉ được sử dụng bởi các máy khách di động và sẽ không được coi là một phần của API cốt lõi, miền lõi.
MikaelW

@MikaelW, bạn nói đúng. Ngay cả những gì Cormac nói là kịch bản lý tưởng, đôi khi bạn đang làm việc với một API cần tham dự nhiều hệ thống khác (máy tính để bàn, thiết bị di động, web, công việc theo lịch trình, hệ thống kế thừa, v.v.). Loại API này cần phải thực sự linh hoạt, cung cấp tài nguyên để tham dự nhiều khả năng nhất có thể nhưng không thể tham dự tất cả các nhu cầu hiệu suất cụ thể từ một người tiêu dùng. Trong trường hợp đó, bạn không có nhiều sự lựa chọn ...
Dherik
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.