Có chiến lược nào để khám phá các dịch vụ REST bằng HATEOAS không?


10

Khi xây dựng dịch vụ REST với ràng buộc HATEOAS , rất dễ dàng để quảng cáo sự tồn tại của tài nguyên thông qua liên kết. Bạn tạo một GETgốc của trang web của tôi và tôi trả lời với tài liệu gốc liệt kê tất cả các tài nguyên cấp đầu tiên:

{
    users: { href: "/users" }
    questions { href: "/questions" }
}

Các khách hàng hiểu cách đọc các hrefgiá trị này có thể thực hiện GETcác yêu cầu trên đó và khám phá tất cả các tài nguyên hiện có trong ứng dụng.

Điều này hoạt động tốt cho các kịch bản tra cứu cơ bản, nhưng không cho biết liệu tài nguyên có thể truy vấn được hay không. Ví dụ, có thể hợp lý để thực hiện:

GET /users?surname=Smith

Có bất kỳ định dạng nào có thể diễn tả khả năng truy vấn này với đủ thông tin mà khách hàng có thể tạo thành một truy vấn mạch lạc mà không cần kiến ​​thức trước về tài nguyên không?

Ngoài ra, có cách nào để thể hiện rằng khách hàng được phép thực hiện một POSTvị trí nhất định với một vị trí dự kiến. Ví dụ: khách hàng có thể thực hiện các thao tác sau để tạo tài nguyên câu hỏi mới:

POST /questions

{
    title: "Are there strategies for discovering REST services using HATEOAS?",
    body: "When building a REST service with the HATEOAS constraint, it's very..."
}

Khi sử dụng HTML làm định dạng cho tiêu dùng của con người, chúng ta có thể thể hiện rất nhiều điều này thông qua việc sử dụng các biểu mẫu và lời nhắc bằng văn bản để cho phép con người khám phá các hoạt động mà họ được phép thực hiện trên một dịch vụ.

Có định dạng nào có khả năng tương tự cho khách hàng không?


2
Vấn đề phát hiện ra dịch vụ REST đã được thảo luận và trả lời tại đây: stackoverflow.com/questions/9101494/ . Giải pháp đơn giản nhất là sử dụng mẫu XHTML với một hình thức không chỉ cho biết về phương pháp bạn có thể sử dụng mà còn cấu trúc đối tượng được gửi qua các phần tử biểu mẫu (đầu vào, chọn, v.v.). Khách hàng chỉ cần có một trình phân tích cú pháp XML để tìm thấy những gì họ cần. Một cách khác là với Mẫu URL nhưng chúng chỉ giúp với các tài nguyên lấy chuỗi truy vấn.
Spoike

Về các loại nội dung; điều đó được giải quyết bằng đàm phán nội dung được thực hiện trong các tiêu đề HTTP. Nếu máy chủ không thể phục vụ loại nội dung được yêu cầu thì nó sẽ trả về lỗi HTTP (chẳng hạn như 300 hoặc 406) cho biết loại nội dung nào có thể trả về.
Spoike

Câu trả lời:


1

Làm thế nào bạn biết loại đầu vào nào được chấp nhận? Điều đó có nghĩa là, nếu khách hàng của bạn không có kiến ​​thức trước, bạn sẽ định nghĩa ngữ nghĩa của "họ" như thế nào? Bạn đang bắt đầu đi vào lãnh thổ cần một cái gì đó như OWL .

Tôi nghĩ sẽ thực tế hơn khi mong đợi khách hàng của bạn hiểu được ngữ nghĩa của các loại mime nổi tiếng; nói, ví dụ, "văn bản / vcard" cho mọi người.


Tôi nghĩ rằng sử dụng loại nội dung là cách để đi; Tôi có thể dễ dàng thay đổi ứng dụng của mình để sử dụng application/atomapp+xmlvà cung cấp cho tất cả các khách hàng đã hiểu định dạng này. Có nhiều loại nội dung nổi tiếng ngoài kia để biến đây thành một giải pháp thiết thực.
Paul Turner

Tôi nghĩ rằng nhận xét của @Spoike là một cách tiếp cận REST-ian thanh lịch đối với nửa kia của vấn đề; ngay cả khi khách hàng biết rằng (ví dụ) người dùng được thể hiện dưới dạng vCard, họ vẫn cần biết tập hợp con nào của các thuộc tính của người dùng có sẵn để tìm kiếm.
Stephen J. Anderson

4

Bạn có thể xuất bản chi tiết về các dịch vụ của mình thông qua "WADL"

http://en.wikipedia.org/wiki/Web_Application_Descrip_L Language

Đó là tùy chọn và không phải mọi kỹ thuật REST phụ trợ đều hỗ trợ điều này. Jersey, triển khai java "chính thức" của jax-rs, chẳng hạn, hỗ trợ nó - nó có thể được tạo tự động cho bạn.

Mặc dù nó khá hiếm khi thấy nó được sử dụng.

Tôi không biết những người lớn sử dụng nó. Nói chung, bạn có một trang web mô tả api.


1
CXF là một triển khai JAX-RS Java lớn khác hỗ trợ WADL và bây giờ bạn cũng bắt đầu thấy một vài người tiêu dùng WADL bên thứ ba thú vị.
Donal Fellows

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.