2012-02-24 24 views
8

Tôi đã đọc rất nhiều cuộc thảo luận ở đây về SO, đã xem Jon Moore's presentation (đã giải thích rất nhiều, btw) và đọc qua bài đăng trên blog của Roy Fielding trên HATEOAS nhưng tôi vẫn cảm thấy một chút trong bóng tối khi nói đến khách hàng thiết kế.HATEOAS Client Design

API Câu hỏi

Còn bây giờ, tôi chỉ đơn giản là trở xhtml với các hình thức/neo và danh sách định nghĩa đại diện cho các nguồn lực. Đoạn mã sau mô tả chi tiết cách tôi đặt các biểu mẫu/neo/danh sách.

# anchors 
<li class='docs_url/#resourcename'> 
    <a rel='self' href='resource location'></a> 
</li> 

# forms 
<form action='action_url' method='whatever_method' class='???'></form> 

# lists 
<dl class='docs_url/#resourcename'> 
    <dt>property</dt> 
    <dd>value</dd> 
</dl> 

Câu hỏi của tôi chủ yếu dành cho biểu mẫu. Trong bài nói chuyện của Jon, ông ghi lại các loại biểu mẫu như (add_location_form), vv và các đầu vào cần thiết cho chúng. Tôi không có nhiều tài nguyên nhưng tôi đã nghĩ về các kiểu biểu mẫu trừu tượng (thêm, xóa, cập nhật, v.v.) và chỉ lưu ý trong tài liệu cho (thêm, cập nhật) mà bạn phải gửi một biểu diễn hợp lệ của tài nguyên đích và với việc xóa, bạn phải gửi số nhận dạng.

Câu hỏi 1: Với khái niệm HATEOAS, nên chúng ta không thực sự chỉ làm cho khách hàng "khám phá" các hình thức (bằng cách classing họ thêm, xóa, cập nhật vv) và chỉ cần gửi lại tất cả dữ liệu chúng tôi đã cho họ? Câu hỏi thực sự của tôi ở đây (không phải là một cuộc thảo luận) có thực hiện theo cách thực hành tốt này không?

Khách hàng Câu hỏi

Sau HATEOAS, với những hành động của chúng ta về tài nguyên là khám phá-thể, như thế nào mã này có hiệu lực khách hàng (người tiêu dùng của các api) và ui của họ. Nghe có vẻ tuyệt vời khi làm theo các hiệu trưởng này, giao diện người dùng chỉ nên hiển thị các hành động có sẵn nhưng cách thực hiện đó?

Cách tiếp cận hiện tại của tôi là phân tích cú pháp phản hồi dưới dạng xml và usin xpath để tìm các hành động được biết tại thời điểm phát triển ứng dụng khách (các lớp biểu mẫu được tạo tài liệu, thêm, xóa, cập nhật) và hiển thị các điều khiển ui nếu chúng có sẵn.

Câu hỏi 2: Tôi có hiểu sai về cách khám phá của mình không? Hoặc là quá nhiều ma thuật như xa như khách hàng là có liên quan (biết các lớp học hình thức)? Điều này không giả định rằng máy khách biết các hành động nào có sẵn cho mỗi tài nguyên (có thể là tốt vì nó là một lý do để tạo máy khách, đúng không?) Và nên ánh xạ các hành động (các lớp biểu mẫu) tới tài nguyên được ghi chép hoặc chỉ ghi lại các lớp biểu mẫu và cho phép ứng dụng khách (và nhà phát triển ứng dụng khách) nghiên cứu và khám phá chúng?

Tôi biết tôi ở mọi nơi với điều này, nhưng mọi thông tin chi tiết đều được đánh giá cao. Tôi sẽ đánh dấu một câu trả lời trả lời bất kỳ câu hỏi nào trong hai câu hỏi này. Cảm ơn!

Trả lời

6

Không, bạn có khá nhiều điểm.

Trình duyệt chỉ cần hiển thị tải trọng HTML và dựa vào Nhân để thực sự diễn giải, tìm ý nghĩa và có khả năng điền các biểu mẫu một cách thích hợp.

Máy khách, cho đến nay, có xu hướng làm khá kém ở phần "diễn giải". Vì vậy, thay vào đó, nhà phát triển phải đưa ra quyết định trước và hướng dẫn khách hàng máy trong chi tiết đầy đủ.

Lý tưởng, một khách hàng HATEOS "thông minh" sẽ có một số sự kiện nhất định và nhận thức được ngữ cảnh để có thể ánh xạ những sự kiện đó một cách tốt hơn đến các yêu cầu của dịch vụ.

Vì đó là những gì chúng tôi làm, phải không? Chúng tôi thấy một hình thức "Ồ, họ muốn tên, địa chỉ, số thẻ tín dụng". Chúng tôi không chỉ biết "tên", "địa chỉ" và "số thẻ tín dụng" nghĩa là gì, chúng tôi cũng có thể intuit có nghĩa là tên MY hoặc tên của người trên thẻ tín dụng hoặc tên của người được giao đến.

Máy cũng không hoạt động tốt ở phần "intuit". Vì vậy, với tư cách là nhà phát triển, bạn có thể viết mã theo logic của những gì bạn nghĩ có thể cần thiết để xác định sự thật chính xác và cách chúng được đặt.

Nhưng, quay trở lại khách hàng lý tưởng, nó sẽ thấy từng hình thức, "biết" những gì các trường muốn, tham khảo danh sách nội bộ của "sự thật", và sau đó điền đúng tải trọng cho yêu cầu và cuối cùng đưa ra yêu cầu.

Bạn có thể thấy rằng một tầm thường, và rõ ràng là dễ vỡ, cách để làm điều đó là chỉ cần ánh xạ các tên tham số cho dữ liệu nội bộ. Khi tên tham số là "tên", bạn có thể mã cứng đến một cái gì đó như: firstName + "" + lastName. Hoặc bạn có thể xem xét thực tế liên quan đến "biết" họ đang nói về vận chuyển, và sử dụng: shipTo.firstName + "" + shipTo.lastName. Theo thời gian, lý tưởng là bạn có thể xây dựng một bộ sưu tập ánh xạ và như vậy nếu đột nhiên một tải trọng giới thiệu một trường mới, và nó đã xảy ra là một trường bạn đã biết, bạn có thể điền vào đó một cách tự động "không thay đổi đối với khách hàng.

Nhưng sự thật đơn giản là, trong khi điều này có thể được thực hiện, nó không được thực hiện nhiều. Ngữ nghĩa thường là cách mơ hồ, bạn phải viết mã trong "trực giác" mới mỗi lần cho mỗi tải trọng mới, vì vậy bạn cũng có thể mã hóa trực tiếp vào tải trọng và được thực hiện với nó.

Điều quan trọng, tuy nhiên, đặc biệt là về HATEOS, là bạn không "buộc" dữ liệu của bạn trên máy chủ. Máy chủ cho bạn biết những gì nó muốn, đặc biệt là nếu họ đang cung cấp cho bạn các biểu mẫu. Vì vậy, quá trình suy nghĩ không phải là "Ồ, nếu tôi muốn một hóa đơn giao hàng, tôi thấy rằng, ngay bây giờ, họ muốn tên, địa chỉ và số thứ tự, và họ muốn url được mã hóa, và họ muốn nó được gửi đến http://example.com/shipping_invoice Vì vậy, tôi sẽ luôn luôn gửi: name + "&" + address + "&" + orderNumber mỗi lần đến http://example.com/shipping_invoice. Dễ dàng! ".

Thay vì những gì bạn muốn làm là "Tôi thấy họ muốn có tên, địa chỉ và số thứ tự. Vì vậy, những gì tôi sẽ làm là cho mỗi yêu cầu, tôi sẽ đọc biểu mẫu của họ. Tôi sẽ kiểm tra xem họ muốn mỗi trường nào Nếu họ muốn tên, tôi sẽ cung cấp cho họ tên, nếu họ muốn địa chỉ, tôi sẽ cung cấp cho họ địa chỉ.Nếu họ muốn số thứ tự, tôi sẽ cung cấp cho họ số thứ tự.Và nếu họ có bất kỳ lĩnh vực PRE-POPULATED (hoặc thậm chí " ẩn "lĩnh vực), tôi sẽ gửi những người trở lại quá, và tôi sẽ gửi nó trong mã hóa họ yêu cầu, giả sử tôi hỗ trợ nó, đến URL tôi nhận được từ lĩnh vực hành động của thẻ FORM.".

Bạn có thể thấy trong trường hợp trước đây, bạn đang ASSUMING rằng họ muốn tải trọng đó mỗi lần. Cũng giống như nếu bạn đang khó mã hóa URL. Trong khi với thứ hai, có thể họ quyết định rằng tên và địa chỉ là thừa, vì vậy họ không yêu cầu nó nữa. Có lẽ họ đã thêm một số mặc định tốt đẹp cho chức năng mới mà bạn có thể chưa hỗ trợ. Có lẽ họ đã thay đổi mã hóa thành nhiều phần? Hoặc thay đổi URL điểm cuối. Ai biết.

Bạn chỉ có thể gửi những gì bạn biết khi bạn mã máy khách, phải không? Nếu họ thay đổi mọi thứ, thì bạn chỉ có thể làm những gì bạn có thể làm. Nếu họ thêm các trường, hy vọng họ thêm các trường không cần thiết. Nhưng nếu họ phá vỡ giao diện, hey, họ phá vỡ giao diện và bạn nhận được để đăng nhập một lỗi. Không nhiều bạn có thể làm ở đó.Tuy nhiên, bạn càng tận dụng được phần HATEOS, bạn càng có thể linh hoạt hơn: các biểu mẫu để điền, chuyển hướng theo đúng cách, chú ý đến các loại mã hóa và phương tiện, bạn càng linh hoạt hơn khách hàng trở thành.

Cuối cùng, hầu hết mọi người chỉ đơn giản là không làm điều đó trong khách hàng của họ. Họ cứng mã heck ra khỏi họ bởi vì nó đơn giản, và họ cho rằng kết thúc trở lại là không thay đổi đủ nhanh để vấn đề, hoặc bất kỳ thời gian chết nếu thay đổi như vậy xảy ra là chấp nhận được cho đến khi họ sửa khách hàng. Thông thường hơn, đặc biệt là với các hệ thống nội bộ, bạn sẽ nhận được email từ các nhà phát triển "hey đã thay đổi XYZ API và nó sẽ phát hành vào ngày 1 tháng 3. Vui lòng cập nhật khách hàng của bạn và phối hợp với nhóm phát hành trong quá trình thử nghiệm tích hợp. Kthx".

Đó chỉ là thực tế. Điều đó không có nghĩa là bạn không nên làm điều đó, hoặc bạn không nên làm cho các máy chủ thân thiện hơn với các khách hàng thông minh hơn. Hãy nhớ rằng một máy khách xấu giả định rằng mọi thứ không làm mất hiệu lực một hệ thống dựa trên REST tốt. Những hệ thống này hoạt động tốt với các khách hàng khủng khiếp. wget ftw, eh?

+0

Hoàn hảo! Vì vậy, bằng cách ghi lại các "lớp" của các biểu mẫu (crud) và hiển thị chúng khi có sẵn theo miền và cho phép khách hàng tìm kiếm các biểu mẫu "đã biết" có vẻ là một cách tiếp cận chấp nhận được, miễn là chúng sử dụng biểu mẫu thay vì giả sử nó . Điều đó thật tuyệt. May mắn thay, trong thời gian này, tôi đang tạo ra cả khách hàng và api. – jowee

+0

Việc tạo các đối tượng bên trong mã máy khách có ánh xạ tới các tài nguyên của máy chủ hay không? Tôi sẽ giả định như vậy, vì điều này sẽ cho phép khả năng cho khách hàng 'điền vào' các trường biểu mẫu mà họ hiểu dễ dàng hơn. Hoặc là quá nhiều sao chép (tức là. DRY). Tôi đoán trong ý nghĩa này nó sẽ là tốt như tôi đang thực sự nói về hai ứng dụng hoàn toàn khác nhau (api, khách hàng), do đó, DRY sẽ không áp dụng. – jowee

+1

Yea, mẹo là viết cho những gì máy chủ thực sự yêu cầu và yêu cầu bạn làm, thay vì những gì bạn nghĩ, tại thời điểm viết, máy chủ muốn làm. Bạn càng giả sử, hệ thống càng mong manh và có khả năng chống thay đổi nó càng trở nên dễ dàng hơn. Nhưng tính linh hoạt có chi phí mã hóa và phức tạp mã, đó là lý do tại sao hầu hết mọi người không bận tâm. –