Không có gì HATEOAS phải làm gì với Nhà nước ứng dụng?


9

HATEOAS là từ viết tắt của "Hypermedia As The Engine Of Application State". "Trạng thái động cơ ứng dụng" đề cập đến điều gì, và đặc biệt - "hypermedia" động cơ của nó như thế nào?

Theo như tôi có thể hiểu, HATEOAS và các tiêu chuẩn liên quan như HAL, giải quyết phần "khám phá" của REST.

Các cuộc thảo luận mùa xuân về nó tóm tắt là:

Với HATEOAS, đầu ra giúp dễ dàng tìm hiểu cách tương tác với dịch vụ mà không cần tra cứu thông số kỹ thuật hoặc tài liệu bên ngoài khác.

Điều có vẻ như là khi bạn thực hiện các phản hồi tuân thủ HATEOAS, ví dụ sử dụng JSON tuân thủ HAL, thì máy khách không phải mã hóa bất kỳ đường dẫn tài nguyên nào ngoại trừ URL API gốc.

Điều này có ý nghĩa hoàn hảo, ngoại trừ việc nó dường như không liên quan gì đến "Trạng thái ứng dụng". Tốt nhất, đó là với Cấu hình máy chủ (IE nếu tôi thay đổi URL cho tài nguyên (Cấu hình máy chủ), người tiêu dùng vẫn có thể tìm ra nơi để tìm thấy nó.


Xây dựng một chút về những gì tôi đã có thể lượm lặt được rằng HATEOAS nói về, có đoạn trích này từ cùng một trang mô tả. Điều cho thấy là HATEOAS đã giải quyết vấn đề khám phá tài nguyên ở đâu. Nhưng nó dường như không liên quan đến "Trạng thái ứng dụng" ....

Một bản trình bày JSON đơn giản được hiển thị theo truyền thống là:

{ 
    "name" : "Alice"
}

Dữ liệu khách hàng ở đó, nhưng dữ liệu không chứa gì về các liên kết liên quan của nó.

Một phản hồi dựa trên HATEOAS sẽ như thế này:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

Phản hồi này không chỉ có tên của người đó, mà bao gồm URL tự liên kết nơi người đó được đặt.


Vui lòng đảm bảo mọi người có thể hiểu câu hỏi của bạn mà không cần nhấp vào liên kết.
candied_orange

Tôi đã hy vọng rằng câu hỏi là độc lập. Liên kết được nhúng nhằm chỉ ra nơi trích dẫn, nhưng trích dẫn là chính nó (tôi nghĩ vậy?)
GreenAsJade

'"Trạng thái động cơ ứng dụng" đề cập đến điều gì?' <- Tôi vẫn không thấy bạn giới thiệu khái niệm này nên câu hỏi không xuất hiện ở đâu.
candied_orange

1
@candied_orange Tôi đã gửi một bản chỉnh sửa để thêm 'HATEOAS là từ viết tắt của "Hypermedia As The Engine Of Application State". ' cho câu hỏi.
bdsl

Hãy bắt đầu từ đầu. Bạn hiểu gì về "Trạng thái ứng dụng".
Laiv

Câu trả lời:


9

Một ứng dụng web, RESTful hay không, thường không chỉ đơn giản là một dịch vụ dữ liệu; nó phơi bày các tài nguyên khác nhau và cung cấp một số hành vi, và vì vậy nó có trạng thái; một phân biệt được thực hiện giữa trạng thái tài nguyên (độc lập với máy khách, được quản lý bởi ứng dụng) và trạng thái ứng dụng , là trạng thái dành riêng cho máy khách. Một ứng dụng không trạng thái không lưu trữ trạng thái ứng dụng (dành riêng cho khách hàng); thay vào đó, nó cho phép khách hàng chịu trách nhiệm về nó và cung cấp một API cho phép chuyển trạng thái (ứng dụng) qua lại (do đó " S tate T ransfer" trong RE ST). Từ góc nhìn của khách hàng, ứng dụng web là một máy trạng thái, nằm sau API cho phép tương tác, nhưng một phần trạng thái được cung cấp dưới dạng thông tin theo ngữ cảnh của khách hàng, để bổ sung các yêu cầu.

Bây giờ, trong khi nghiên cứu REST, bạn có thể đã tình cờ phát hiện ra một thứ gọi là Mô hình trưởng thành của Richardson- nó mô tả "sự trưởng thành" của API ứng dụng web (phát triển qua nhiều năm), nhưng nó hữu ích đối với chúng tôi như một loại tài liệu tham khảo đặt mọi thứ vào ngữ cảnh. Trong mô hình này, tất cả các mức trưởng thành, ngoại trừ mức cuối cùng, về cơ bản đều cung cấp các API tạo điều kiện cho các RPC qua HTTP. Theo kiểu thiết kế API này, HTTP được sử dụng như một cơ chế vận chuyển, nhưng giao tiếp thực tế xảy ra qua các giao thức tùy chỉnh, do đó các hệ thống tương tác (máy khách và ứng dụng) dựa vào cái gọi là "thông tin ngoài băng tần" để giao tiếp (trong điều này bối cảnh, điều này chỉ có nghĩa là các hệ thống này giao tiếp bằng cách sử dụng một số tiêu chuẩn tùy chỉnh thay vì tận dụng siêu văn bản / hypermedia và, giả sử, giao thức HTTP hiện có). Vì vậy, những gì thúc đẩy chuyển trạng thái và chuyển trạng thái ("động cơ của trạng thái ứng dụng") không phải là hypermedia trong trường hợp này.

Mức trưởng thành cuối cùng đưa ra ràng buộc HATEOAS và chỉ sau đó API mới trở thành RESTful. Máy khách khởi tạo sự tương tác thông qua URI ban đầu; máy chủ phản hồi với biểu diễn trạng thái ứng dụng dựa trên hypermedia phù hợp (có thể khác nhau giữa các thiết bị hoặc máy khách hoặc do các điều kiện khác nhau - do đó " Re trình bày" trong RE ST), bao gồm các hành động tự mô tả cho phép máy khách bắt đầu quá trình chuyển đổi trạng thái tiếp theo (vì vậy hypermedia hiện là thứ trực tiếp hỗ trợ và thúc đẩy trạng thái ứng dụng).

Tôi có thể chọn tuyên bố rằng "Trạng thái ứng dụng là ứng dụng khách cụ thể" không. Đó là cách tôi hiểu nó. [...] Nó hoàn toàn có liên quan đến tính khả dụng của tài nguyên phía máy chủ, không có gì (rõ ràng mà tôi có thể thấy) liên quan đến trạng thái máy khách ...

Trước tiên hãy để tôi chắc chắn rằng chúng ta đang ở trên cùng một trang. Đây không phải là trạng thái máy khách (như trong trạng thái bên trong của chính máy khách), mà là trạng thái của ứng dụng web dành riêng cho một máy khách cụ thể.

Ví dụ bạn đề cập không thực sự minh họa tốt cho nó, nhưng danh sách các liên kết được trả về về cơ bản được tạo động trên máy chủ và thể hiện các chuyển đổi trạng thái hiện có và do đó, nó mã hóa trạng thái ứng dụng hiện tại (cho ứng dụng khách cụ thể đó). Lưu ý rằng bạn có thể chọn chuyển các bit thông tin liên quan đến trạng thái khác (theo cả hai hướng) nếu ứng dụng của bạn yêu cầu (vì vậy bạn không bị giới hạn đối với siêu dữ liệu chuyển đổi trạng thái), nhưng hạn chế là không bao giờ nhớ bất kỳ dữ liệu cụ thể nào của khách hàng trên Máy chủ, vì điều đó làm tổn thương khả năng bán được. Cũng lưu ý rằng trạng thái này không phải hoàn thành (không nhất thiết phải hoàn toàn có ý nghĩa khi bạn nhìn riêng lẻ), nhưng nó phải đủ để bên nhận đưa ra quyết định và thực hiện logic dựa trên nó và không có gì khác (vì vậy,

HATEOAS tận dụng giao diện thống nhất (các tiêu chuẩn và định dạng trao đổi dữ liệu chung) để tách rời các máy khách và máy chủ để ở phía máy chủ, chúng có thể xáo trộn các thứ xung quanh đằng sau "hợp đồng" được xác định bởi loại hypermedia, nhưng cũng vì giao tiếp dựa trên thông tin băng tần (giao thức tùy chỉnh) thường không tận dụng cơ sở hạ tầng mạng theo cách mà REST nhắm đến. (Xem phần thảo luận bên dưới.)

Trong ví dụ của bạn, máy khách sẽ không dựa trên logic của nó trên URI, mà dựa trên siêu dữ liệu (hoặc chú thích), như thuộc tính "rel". Ví dụ: trình duyệt không quan tâm đến các URI trong liên kết, nó chỉ cần biết đó là loại liên kết nào (liên kết có thể nhấp, một hình thức mà bạn có thể tạo URI, tham chiếu biểu định kiểu, v.v.)

REST trong bối cảnh

Thật không may, REST đã trở thành một từ thông dụng và mọi người đang nói về cách trở thành RESTful, nhưng toàn bộ bối cảnh của REST bị thiếu và bạn không thể hiểu được phong cách kiến ​​trúc REST mà không hiểu ngữ cảnh này (vấn đề mà REST thực sự là gì cố gắng giải quyết).

REST là một khái quát của kiến ​​trúc đằng sau Web . Đối với hầu hết chúng ta, Web là một nền tảng. Nhưng đối với những người đã phát triển REST, WWW là một ứng dụng , có một bộ yêu cầu nhất định, chạy trên một mạng toàn cầu. Vì vậy, REST có nghĩa là cho các hệ thống giống như Web trong một số khía cạnh quan trọng, cần phải đáp ứng một tập các thuộc tính nhất định.

Đây là những hệ thống mạng quy mô lớn tồn tại lâu dài (nghĩ nhiều thập kỷ). Đây là các hệ thống vượt qua các ranh giới tổ chức (ví dụ: các công ty hợp tác) hoặc các ranh giới giữa các chi nhánh khác nhau trong một tổ chức lớn (như các bộ phận khác nhau và thậm chí các nhóm). Mặc dù có sự hợp tác, các thực thể liên quan chủ yếu vận hành (làm việc, phát triển và triển khai phần mềm) theo cách riêng của họ, theo tốc độ của riêng họ, với mối quan tâm bảo mật của riêng họ và tất cả họ đều sử dụng các thiết bị, hệ điều hành khác nhau, v.v. cần truy cập và chia sẻ tài liệu tham khảo đến các tài nguyên của nhau (tài liệu, dịch vụ, dữ liệu), trong khi có thể phát triển độc lập và tăng dần, mà không cần phải phối hợp rộng rãi (heck, thật khó để mọi người thực hiện triển khai phối hợp ngay cả trong cùng một tổ chức).

Những người cung cấp dịch vụ cần có khả năng thực hiện những việc như phát triển các phiên bản dịch vụ, thêm nút hoặc xáo trộn dữ liệu xung quanh với hiệu quả tối thiểu đối với khách hàng. Họ cần phải mở rộng quy mô. Khách hàng (có thể tự là dịch vụ) cần tiếp tục hoạt động mặc dù tất cả hoạt động này ở phía máy chủ. Các hệ thống có thể sẽ được sử dụng theo những cách không lường trước được trong tương lai. Các tài nguyên họ truy cập và trao đổi có thể có nhiều loại khác nhau và được nhận ra (được mã hóa, đánh máy, đại diện, cấu trúc) trong nội bộ (bởi các nhà cung cấp dịch vụ) theo nhiều cách khác nhau, nhưng ngay cả đối với toàn bộ hệ thống / mạng, một cách nhất quán tài nguyên truy cập và dữ liệu cấu trúc và phản hồi là bắt buộc (giao diện thống nhất).

REST tính đến tất cả những điều này, và rất nhiều xem xét các thuộc tính của mạng. Nó có nghĩa là để giải quyết các nhu cầu của các ứng dụng, ở mức độ cao (trong lĩnh vực kinh doanh của riêng họ), tương tự về các yêu cầu và ràng buộc đối với những gì được nêu ở trên (hoặc mong muốn).

Và nó có, nhưng nó không phải là thuốc chữa bách bệnh. Có chi phí và sự đánh đổi. Nó áp đặt một phong cách giao tiếp nhất định, và có một hiệu suất thành công. Bạn luôn truyền dữ liệu theo cách phân loại thô, thường là cùng một dữ liệu lặp đi lặp lại, theo định dạng chung chung (và do đó có thể không hiệu quả nhất cho dịch vụ của bạn), với một loạt siêu dữ liệu, thường xuyên qua các nút mạng trung gian ( do đó, tất cả các bộ nhớ đệm trên Web - nó giảm thiểu việc gửi dữ liệu qua lại, giữ máy khách tránh xa dịch vụ khi có thể). Hiệu suất nhận thức của người dùng rất quan trọng, điều này ảnh hưởng đến cách bạn viết ứng dụng khách (đây là lý do tại sao trình duyệt bắt đầu hiển thị trang trước khi mọi thứ được tải xuống hoặc sẵn sàng). Nhưng bạn vui vẻ trả chi phí đó để có thể xây dựng một hệ thống với các thuộc tính được mô tả ở trên.

Ngược lại, nếu bạn đang xây dựng một hệ thống có các yêu cầu / ràng buộc khác nhau, chi phí có thể không đáng.


Cảm ơn phản hồi chi tiết này. Tôi có thể chọn tuyên bố rằng "Trạng thái ứng dụng là ứng dụng khách cụ thể" không. Đó là cách tôi hiểu nó. Vì vậy, những gì tôi không hiểu là những gì đại diện HAL mà chúng ta thấy trong các ví dụ có liên quan đến trạng thái ứng dụng dành riêng cho khách hàng? Nó có tất cả để làm với tính khả dụng của tài nguyên phía máy chủ, không có gì (rõ ràng là tôi có thể thấy) để làm với trạng thái máy khách ...
GreenAsJade

@GreenAsJade: Xin lỗi vì đã trả lời trễ, nhưng tôi đã mở rộng câu trả lời của mình để giải quyết câu hỏi của bạn tốt hơn.
Filip Milovanović

10

Nếu bạn muốn hiểu REST, hoặc HATEOAS, có lẽ bạn nên bắt đầu bằng cách hiểu web . HAL (một cách hiệu quả) chỉ là sự thay thế cho HTML; nếu bạn hiểu cách HTML "hoạt động", thì việc hiểu vai trò của HAL dễ dàng hơn nhiều.

"Động cơ của trạng thái ứng dụng" đề cập đến là gì?

Chương 5 của Luận án Fielding .

REST được xác định bởi bốn ràng buộc giao diện: xác định tài nguyên; thao túng tài nguyên thông qua các đại diện; tin nhắn tự mô tả; và, hypermedia là động cơ của trạng thái ứng dụng. - Giao diện thống nhất

Do đó, trạng thái của ứng dụng được xác định bởi các yêu cầu đang chờ xử lý, cấu trúc liên kết của các thành phần được kết nối (một số có thể lọc dữ liệu được đệm), các yêu cầu hoạt động trên các trình kết nối đó, luồng dữ liệu biểu diễn để đáp ứng các yêu cầu đó và xử lý các yêu cầu đó đại diện khi chúng được nhận bởi tác nhân người dùng. - Xem dữ liệu

Do đó, ứng dụng mô hình là một công cụ chuyển từ trạng thái này sang trạng thái tiếp theo bằng cách kiểm tra và lựa chọn trong số các chuyển đổi trạng thái thay thế trong bộ biểu diễn hiện tại. Không có gì đáng ngạc nhiên, điều này hoàn toàn khớp với giao diện người dùng của trình duyệt hypermedia. Tuy nhiên, phong cách không cho rằng tất cả các ứng dụng là trình duyệt. Trên thực tế, các chi tiết ứng dụng bị ẩn khỏi máy chủ bởi giao diện kết nối chung và do đó, một tác nhân người dùng có thể là một robot tự động thực hiện truy xuất thông tin cho một dịch vụ lập chỉ mục, một tác nhân cá nhân tìm kiếm dữ liệu phù hợp với tiêu chí nhất định hoặc bảo trì Spider bận tuần tra thông tin cho các tài liệu tham khảo bị hỏng hoặc nội dung được sửa đổi - Chế độ xem dữ liệu

Xem xét cách tìm kiếm của Google hoạt động: bạn sử dụng dấu trang để cập nhật bản sao lưu trong bộ nhớ cache của biểu mẫu tìm kiếm, tải biểu mẫu, nhập truy vấn của bạn vào biểu mẫu, gửi và đọc kết quả. Không ai trong số đó cần bất kỳ khả năng nào của Google được tích hợp trong máy khách - tất cả đều sử dụng khả năng HTML; siêu dữ liệu kèm theo biểu mẫu báo cho trình duyệt (thông qua các quy tắc xử lý được tiêu chuẩn hóa) cách xây dựng một yêu cầu HTTP sẽ trả về một đại diện của tài nguyên còn lại (còn gọi là kết quả tìm kiếm).

HAL đóng vai trò tương tự - một khách hàng nhận biết HAL có thể áp dụng các quy tắc xử lý để khám phá các liên kết trong các biểu diễn và thực hiện những điều thông minh với các liên kết đó. Máy khách nhận biết JSON không thể, vì không có gì trong mô hình xử lý JSON xác định liên kết.

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.