2012-02-09 29 views
75

Để khởi động SaaS, tôi đang xây dựng cả một API web RESTful và một vài ứng dụng khách trên các nền tảng khác nhau sử dụng nó. Tôi nghĩ rằng tôi đã có API tìm ra, nhưng bây giờ tôi đang chuyển sang các khách hàng. Như tôi đã đọc về REST, tôi thấy rằng một phần quan trọng của REST là khám phá, nhưng dường như có rất nhiều cuộc tranh luận giữa hai giải thích khác nhau về những gì khám phá thực sự có nghĩa là:Khả năng phát hiện thời gian chạy RESTful API/thiết kế máy khách HATEOAS

  1. Developer khám phá: Nhà phát triển mã hóa rất nhiều chi tiết API vào khách hàng, chẳng hạn như tài nguyên, tham số truy vấn, phương thức HTTP được hỗ trợ và các chi tiết khác mà họ đã phát hiện thông qua duyệt tài liệu và thử nghiệm với phản hồi của API. Kiểu khám phá IMHO này đòi hỏi liên kết mát mẻ và câu hỏi về phiên bản API, và dẫn đến việc ghép nối cứng mã khách hàng với API. Không tốt hơn nhiều nếu sử dụng một bộ sưu tập tài liệu của RPC.

  2. Runtime khám phá - (. Có lẽ, chỉ có một sự hiểu biết về các loại phương tiện truyền thông các thỏa thuận API với) Các ứng dụng client chính nó là có thể tìm ra tất cả những gì nó cần có ít hoặc không có thông tin out-of-band Liên kết có thể nóng. Nhưng để làm cho API rất hiệu quả, rất nhiều liên kết templating cho các tham số truy vấn có vẻ là cần thiết, mà làm cho out-of-band thông tin creep trở lại in Có thể có những khó khăn khác tôi đã không nghĩ đến từ khi tôi đã không đến thời điểm đó trong phát triển. Nhưng tôi thích ý tưởng ghép nối lỏng lẻo.

Runtime khám phá dường như là Chén thánh của REST, nhưng tôi nhìn thấy thảo luận ít quý về cách triển khai một khách hàng như vậy. Hầu như tất cả các nguồn REST tôi đã tìm thấy dường như giả định phát hiện của nhà phát triển. Có ai biết về một số tài nguyên khám phá Runtime không? Thực hành tốt nhất? Ví dụ hoặc thư viện có mã thực? Tôi đang làm việc trong PHP (Zend Framework) cho một khách hàng. Mục tiêu-C (iOS) cho người khác.

Thời gian chạy có phát hiện ra mục tiêu thực tế không, với tập hợp các công cụ và kiến ​​thức hiện tại trong cộng đồng nhà phát triển? Tôi có thể viết khách hàng của tôi để xử lý tất cả các URI theo cách mờ đục, nhưng làm thế nào để làm điều này hiệu quả nhất là một câu hỏi, đặc biệt là trên các kết nối băng thông thấp. Dù sao, URI chỉ là một phần của phương trình. Điều gì về liên kết templating trong bối cảnh thời gian chạy? Làm thế nào về giao tiếp những phương pháp được hỗ trợ, ngoài việc thực hiện rất nhiều yêu cầu OPTIONS?

+2

Chỉ cần một chút sang một bên tham chiếu OPTIONS của bạn. Bạn có thể sử dụng tiêu đề 'Cho phép' để giao tiếp các hoạt động tài nguyên được phép bên ngoài yêu cầu OPTIONS. Roy Fielding đi xa như xem xét tiêu đề như là một dạng siêu văn bản - xem [ở đây] (http://tech.groups.yahoo.com/group/rest-discuss/message/14432). – paulkmoore

+0

tats một câu hỏi gr8, các vấn đề chính được đưa ra danh sách các phương pháp áp dụng, nên khách hàng có thể hình thành các url cho hoạt động CRUD thường xuyên hoặc sẽ được gọi là "out-of-band"? Nói, nếu chúng tôi cung cấp liên kết cho các hoạt động CRUD, làm thế nào để u làm "mẫu" s trong json? Có thể nếu ur sử dụng các loại phương tiện cụ thể của ứng dụng u không cần phải làm "biểu mẫu", nhưng wat là cách tiêu chuẩn để khám phá các loại phương tiện (tức là lược đồ json), thì quá trình khám phá lược đồ được coi là không "ngoài" ban nhạc "cho khách hàng ?? – redzedi

+0

xhtml trông rất đẹp và chất lỏng, nhưng nếu bạn phải làm json, tôi đoán là không định hình bây giờ – redzedi

Trả lời

33

Trong video này, Jon Moore xây dựng một ứng dụng khách chung bằng cách sử dụng khám phá tự động HATEOAS thời gian chạy. Nó là khá ấn tượng và cũng có giá trị xem:

http://oredev.org/oredev2010/2010/sessions/hypermedia-apis.html

+2

là mã "src" của khách hàng có sẵn ở đâu đó? tôi không thấy bất kỳ mã khách hàng nào ở đó, anh ấy chỉ sử dụng ứng dụng khách của mình trong các ví dụ java – Denny1989

+1

@ Denny1989 Tôi nghĩ đây là mã nguồn: https://github.com/cimlabs/hypermedia-client-java – dbank

19

Đây chắc chắn là một hạt khó khăn để crack. Tại Google, chúng tôi đã triển khai Dịch vụ khám phá của mình rằng tất cả các API mới của chúng tôi đều được xây dựng. Phiên bản TL; DR là chúng tôi tạo ra một đặc tả giống như Lược đồ JSON mà các khách hàng của chúng tôi có thể phân tích cú pháp - nhiều trong số đó là động.

Kết quả đó có nghĩa là nâng cấp SDK dễ dàng hơn cho nhà phát triển và bảo trì dễ dàng/tốt hơn cho chúng tôi.

Không có nghĩa là giải pháp hoàn hảo, nhưng nhiều nhà phát triển của chúng tôi có vẻ thích.

Xem link để biết thêm chi tiết (và chắc chắn để xem vid.)

+0

Có standart nào để triển khai dịch vụ khám phá này cho các API của chúng ta không? –

11

hấp dẫn. Những gì bạn mô tả về cơ bản là nguyên tắc HATEOAS. HATEOAS bạn hỏi là gì?Đọc điều này: http://en.wikipedia.org/wiki/HATEOAS

Theo thuật ngữ của giáo dân, HATEOAS có nghĩa là liên kết sau. Cách tiếp cận này tách riêng khách hàng của bạn khỏi URL cụ thể và cung cấp cho bạn sự linh hoạt để thay đổi API của bạn mà không vi phạm bất kỳ ai.

+0

Cảm ơn bạn đã nhắc tôi về HATEOAS. Đó dường như là từ khóa tôi đã bỏ lỡ để giúp tôi tìm ra những gì cần làm với các giao diện khách hàng của tôi. (Người đàn ông, tôi thực sự không thích từ viết tắt đó!) Tôi đã gặp HATEOAS trước đây, và tôi đoán tôi đã nội tâm hóa ý nghĩa của nó nhưng tôi quên sử dụng tên trong tìm kiếm của mình. Tôi thấy rất nhiều tài nguyên hiện đang mang lại cho tôi một bức tranh tốt hơn, và một số hy vọng rằng nó không phải là không thể đạt được sau khi tất cả. – curtisdf

+0

mẫu ios? bạn đã chọn gì ? tại một số điểm bạn cần phải biết những gì bạn đang tìm kiếm! vì vậy bạn cần biết API để bạn cần phải mã hóa một số nội dung! – Vassily

+0

@curtisdf Hoàn toàn tắt chủ đề, nhưng thay vì nói rằng bạn thực sự không thích nó, nên nói rằng bạn HATE-nó ... Hate-OAS ... :) Xin lỗi, không thể cưỡng lại – jamiebarrow

1

Tôi nghĩ rằng điểm quan trọng về HATEOAS không là nó là một số Chén thánh client-side, nhưng mà nó phân lập các khách hàng từ những thay đổi URI - nó được giả định bạn đang sử dụng mối quan hệ liên kết được biết đến (hoặc phát hiện được phát hiện) sẽ cho phép hệ thống biết liên kết nào cho một đối tượng là biểu mẫu có thể chỉnh sửa. Điểm quan trọng là sử dụng loại emdia là nhận thức hypermedia (ví dụ: HTML, XHTML, v.v.).

0

Bạn viết:

Để thực hiện các API rất hiệu quả, rất nhiều liên kết khuôn mẫu cho tham số truy vấn dường như cần thiết, làm cho thông tin out-of-band trở lại.

Nếu mẫu liên kết đó được cung cấp trong yêu cầu trước, thì không có thông tin ngoài băng. Ví dụ: biểu mẫu tìm kiếm HTML sử dụng liên kết templating (/search?q=%@) để tạo URL (/search?q=hateoas), nhưng không có gì được khách hàng biết (trình duyệt web) khác với cách sử dụng biểu mẫu HTML và GET.

+0

thực sự không có thông tin về băng tần - máy khách chịu trách nhiệm mở rộng các mẫu uri bằng cách sử dụng dữ liệu tài nguyên/cá thể được cung cấp (và nên biết cách thực hiện điều này) - http://json-schema.org/latest/json-schema-hypermedia. html # anchor18 – fusi

3

Một trong những yêu cầu cần được thỏa mãn trước khi bạn có thể gọi API 'RESTful' là có thể viết ứng dụng khách chung trên API đó. Với ứng dụng khách chung, người dùng sẽ có thể truy cập tất cả chức năng của API. Một máy khách chung là một ứng dụng khách mà không cho rằng bất kỳ tài nguyên nào có một cấu trúc cụ thể ngoài cấu trúc được định nghĩa bởi kiểu phương tiện. Ví dụ: trình duyệt web là ứng dụng khách chung hiểu biết cách diễn giải HTML, bao gồm biểu mẫu HTML, v.v.

Bây giờ, giả sử chúng tôi có API HTTP/JSON cho cửa hàng trực tuyến và chúng tôi muốn tạo HTML/CSS/Trình khách JavaScript cung cấp cho khách hàng của chúng tôi trải nghiệm người dùng tuyệt vời. Nó có phải là một lựa chọn thực tế để cho phép khách hàng đó là ứng dụng khách chung của khách hàng không? Không. Chúng tôi muốn cung cấp giao diện cụ thể cho từng yếu tố dữ liệu cụ thể và mọi trạng thái ứng dụng cụ thể. Chúng tôi không muốn bao gồm tất cả kiến ​​thức về các bản trình bày cụ thể này trong API, ngược lại, khách hàng nên xác định giao diện và API chỉ nên mang dữ liệu. Điều này ngụ ý rằng khách hàng đã ghép nối mã hóa cứng các phần tử tài nguyên cụ thể với các bố cục cụ thể và các tương tác của người dùng.

Đây có phải là kết thúc của HATEOAS và do đó kết thúc REST không? Có và không.

, bởi vì nếu chúng tôi biết mã cứng về API vào ứng dụng, chúng tôi sẽ mất lợi ích của HATEOAS: thay đổi phía máy chủ có thể làm hỏng máy khách.

Không, vì hai lý do:

  1. Là "RESTful" là một tài sản của API, không phải của khách hàng. Miễn là có thể, trong lý thuyết, để xây dựng một ứng dụng khách chung cung cấp tất cả các khả năng của API, API có thể được gọi là RESTful. Thực tế là khách hàng không tuân thủ các quy tắc, không phải là lỗi của API. Thực tế là một khách hàng chung sẽ có một trải nghiệm người dùng tồi tệ không phải là một vấn đề. Tại sao điều quan trọng là phải biết rằng có thể là để có ứng dụng khách chung, nếu chúng tôi thực sự không có ứng dụng khách chung đó? Điều này đưa tôi đến lý do thứ hai:
  2. API RESTful cung cấp cho khách hàng tùy chọn để chọn mức độ chung chung của họ, tức là khả năng phục hồi các thay đổi phía máy chủ mà họ muốn. Khách hàng cần cung cấp trải nghiệm người dùng tuyệt vời có thể vẫn có khả năng phục hồi các thay đổi URI, thay đổi về giá trị mặc định và hơn thế nữa. Khách hàng thực hiện các công việc theo lô mà không có sự tương tác của người dùng có thể thích ứng với các loại thay đổi khác.

Nếu bạn quan tâm đến các ví dụ thực tế, hãy kiểm tra JAREST paper. Phần cuối cùng là về HATEOAS. Bạn sẽ thấy rằng với JAREST, ngay cả những khách hàng tương tác cao và trực quan hấp dẫn có thể khá kiên cường với các thay đổi phía máy chủ, mặc dù không phải là 100%.

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