2009-09-09 25 views
8

Tôi đang làm việc trên một hệ thống doanh nghiệp sẽ sử dụng dịch vụ web RESTful giữa các máy khách di động và máy chủ trung tâm. Như RESTful càng tốt, hãy nói.Dịch vụ web yên tĩnh: cố gắng đạt được HATEOAS với XML tùy chỉnh

Câu hỏi của tôi liên quan đến HATEOAS (hypermedia làm công cụ của trạng thái ứng dụng) và việc sử dụng xml tùy chỉnh trong các cơ quan phản hồi HTTP.

Hệ thống này sẽ không bao giờ được sử dụng bởi khách hàng công cộng, nhưng tôi thích ý tưởng HATEOAS có thể sửa đổi mẫu phân bổ tài nguyên phía máy chủ sau này mà không phải định cấu hình lại từng ứng dụng khách một cách độc lập. Nếu chúng tôi quyết định rằng do vấn đề mở rộng quy mô, chúng tôi cần phải trải rộng chức năng máy chủ trên nhiều hộp vật lý, không có vấn đề gì, điều này sẽ được phản ánh trong URI được tạo khi khách hàng (hoặc máy chủ theo lệnh từ khách hàng) tạo tài nguyên mới .

Tên miền kinh doanh của chúng tôi rất cụ thể và khác thường. Do đó, tôi muốn sử dụng XML tùy chỉnh cho các thực thể phản hồi HTTP trên toàn bộ dịch vụ web và máy khách sẽ phân tích các URI tài nguyên ra khỏi xml để được thông báo về các vị trí tài nguyên mà nó có thể sử dụng khi sửa đổi trạng thái ứng dụng riêng của nó. Tôi biết rằng điều này 'phá vỡ' phần H của HATEAOS.

ví dụ: khi một khách hàng POST một giao dịch đến máy chủ để xử lý, máy chủ có thể bao gồm đoạn xml sau đây trong nội dung phản hồi HTTP HTTP (như một phần của tài liệu xml lớn hơn). Máy chủ cũng sẽ thông báo cho khách hàng của URI về tài nguyên giao dịch mới được tạo ra, nhưng điều này có thể chỉ được bao gồm trong tiêu đề HTTP vị trí.

<resulturi>http://resultserver/results/1234.xml</resulturi> 

Đây có phải là vì vậy không? Có rất ít cơ hội mà các khách hàng sử dụng dịch vụ này sẽ bao giờ được dựa trên trình duyệt. Những ưu điểm khác của hypermedia khi phân phối uris là văn bản thuần trong xml?

Tôi đoán tôi có thể truy cập XHTML, nhưng trình phân tích cú pháp trên nền tảng di động của chúng tôi hiệu quả hơn nhiều với POX.

+1

> Tôi biết rằng điều này 'phá vỡ' phần H của HATEAOS. Có phải không? Tôi không biết rằng HATEOAS đặt những ràng buộc về loại nội dung mà bạn có thể sử dụng. – trendels

Trả lời

9

Điều bạn đang làm bằng cách trả lại url trong resulturi là hypermedia hiệu quả rồi. Vấn đề duy nhất là bạn cần một loại phương tiện truyền thông cho khách hàng biết cách phản hồi được định dạng sao cho nó có thể phân tích cú pháp các url trong một cách có thể đoán trước và được ghi nhận.

Tùy chọn 1: Tạo loại phương tiện truyền thông của riêng bạn như vnd.yourcompany.Resource + xml. Bằng cách này, bạn đang nói rằng loại phương tiện truyền thông có thể được phân tích bởi một trình phân tích cú pháp xml, nhưng nó tuân theo một số quy tắc đặc biệt được xác định bởi công ty của bạn. Tại thời điểm này, bạn có thể sử dụng bất kỳ tiêu chuẩn nào bạn muốn để xác định các liên kết hypermedia (xem câu hỏi this). Một lợi thế tốt đẹp của việc này là nếu trong 6 tháng bạn quyết định bạn cần thực hiện một thay đổi đột phá đối với định dạng XML của bạn, bạn có thể tạo một vnd.yourcompany.ResourceV2 + xml và miễn là bạn đủ thông minh để sử dụng accept- tiêu đề trên các ứng dụng khách cũ của mình, bạn có thể giới thiệu định dạng mới cạnh nhau với phiên bản cũ bằng cách tạo ứng dụng khách mới chấp nhận định dạng mới.

Tùy chọn 2: Tôi chỉ nghiêm túc một nửa về tùy chọn này, nhưng tôi đã cân nhắc việc đẩy một loại trung gian mới có tên là application/hyperxml + xml. Tài liệu sẽ tuân theo các quy tắc tương tự như application/xml nhưng cũng sẽ sử dụng XLink cho hypermedia. Điều này sẽ cho phép những người đang sử dụng javascript để phân tích cú pháp tài liệu XML để tận dụng lợi thế của hypermedia theo cách được chuẩn hóa.

Tùy chọn 3: Sử dụng XHtml. Tôi không hiểu tại sao trình phân tích cú pháp của bạn gặp vấn đề với Xhtml, nhưng tôi sẽ nói lời của bạn cho nó.

2

Có hai thông tin quan trọng mà máy chủ RESTful của bạn sẽ cần xử lý các yêu cầu, bất kể ngôn ngữ đánh dấu cơ bản: loại phương tiện và URI. Giả sử một loại phương tiện truyền thông cho một URI nhất định sẽ giới thiệu khớp nối máy khách-máy chủ. Nó sẽ, ví dụ, ngăn chặn cùng một URI từ bao giờ phục vụ hai loại phương tiện truyền thông khác nhau.

XML không phải là lựa chọn duy nhất khi thiết kế định dạng hypermedia. Hãy xem Sun Cloud API, xác định API REST hypertext-driven dựa trên JSON (mặc dù nó dường như không sử dụng loại phương tiện truyền thông với các siêu liên kết của nó). Nó không phải là khó khăn để đi từ phương pháp này đến một trong đó kết hợp các loại phương tiện truyền thông với các siêu liên kết.

Ví dụ: bạn có thể xác định cấu trúc dữ liệu JSON được gọi là Liên kết trông như thế này;

{ 
    "name":"human-readable label for link", 
    "uri":"http://example.com/resources/123", 
    "media_type":"application/vnd.com.example.Resource+json" 
} 
2

Hypermedia không yêu cầu HTML hoặc thậm chí URI đủ điều kiện cho vấn đề đó. Nếu loại phương tiện truyền thông của bạn xác định quy tắc để chuyển một số yếu tố của phản hồi thành các tài nguyên không thể tham chiếu thì bạn có hypermedia.

<result>1234</result> 

Ví dụ trên, kết hợp với một loại quy tắc truyền thông về cách dereference các nội dung của phần tử kết quả là hypermedia trong cùng một cách mà:

<result>/foo/1234</result> 

là với một quy tắc để thêm vào trước các cơ sở URI http. Vì vậy, là ví dụ dưới đây, nơi thực tế rằng chuỗi http là dereferencable có thể được ẩn ngầm.

<result>http://myserver.com/foo/1234</result> 

Tuy nhiên, trong khi họ là tất cả hypermedia và đáp ứng hạn chế đó, tôi sẽ tranh luận chống lại việc tạo ra quy tắc sản xuất hypermedia mới của riêng bạn và các thẻ nếu có thể và chỉ cần tái sử dụng những cái hiện có. Ví dụ đầu tiên làm cho người dùng ít rõ ràng hơn rằng phần tử này đại diện cho một tài nguyên được siêu liên kết so với ví dụ cuối cùng.

+0

Hai ví dụ đầu tiên yêu cầu thông tin ngoài băng cho khách hàng ... và vì vậy chúng không phải là RESTful. – HDave

+0

Đây là cách thẻ neo hoạt động trong HTML - HREF. Quy tắc xử lý phương tiện cụ thể cho phép các url tương đối. –

0

Tôi khuyên bạn nên thay vì viết mã tay các siêu liên kết này, hãy sử dụng công cụ tạo siêu liên kết đó cho bạn. Lập trình hướng tương tác là một phương pháp tốt để tạo các tương tác này (siêu liên kết). Hãy làm theo liên kết này công nghệ này làm việc cho chúng tôi http://www.masterkube.com/hateoas_technology.html

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – PKirby

0

Tối thiểu rất (ngay cả khi bạn không làm gì khác), bạn nên đặt URL của bạn trong một XLink thuộc tính thay cho nội dung phần tử:

<resulturi xlink:href="http://resultserver/results/1234.xml"/> 

XML các bộ vi xử lý có thể phân tích cú pháp và thực hiện theo các nguyên tắc này như các URI. Theo nguyên tắc chung, văn bản không thể dịch hoặc không bao giờ có các phần tử phụ phải nằm trong thuộc tính để thực thi các hạn chế đó.

Nhưng ngoài điều này, hãy làm những gì người khác đã đề xuất và xác định loại phương tiện của bạn để ý nghĩa có thể được hiểu bởi khách hàng.

Các vấn đề liên quan