2008-09-30 40 views
32

Tôi đang bắt đầu một dự án bằng kiến ​​trúc Restful được triển khai trong Java (sử dụng tiêu chuẩn JAX-RS mới)Có khả thi để tạo một máy khách REST với Flex không?

Chúng tôi đang có kế hoạch phát triển GUI bằng ứng dụng Flex. Tôi đã tìm thấy một số vấn đề với việc triển khai này bằng cách sử dụng thành phần HTTPService (mã lỗi phản hồi, truy cập tiêu đề ...).

Bất kỳ ai trong số các bạn đều có kinh nghiệm trong một dự án tương tự. Nó là khả thi?

Trả lời

23

Vấn đề ở đây là có rất nhiều cuộc thảo luận trên web về vấn đề này là một năm trở lên. Tôi đang làm việc thông qua nghiên cứu này ngay bây giờ, và đây là những gì tôi đã học được ngày hôm nay.

Điều này IBM Developer Works article from August 2008 bởi Jorge Rasillo và Mike Burr cho biết cách thực hiện ứng dụng Flex front-end/RESTful back-end (ví dụ trong PHP và Groovy). Bài viết hay. Dù sao, đây là việc lấy đi:

  • Mã PHP/Groovy của họ sử dụng và mong đợi PUT và DELETE.
  • Nhưng mã Flex phải sử dụng POST, nhưng đặt tiêu đề HTTP X-Method-Override thành DELETE (bạn có thể làm tương tự cho PUT I presume).
  • Lưu ý rằng đây là không phải là phương thức Proxy được thảo luận ở trên.

 
// Flex doesn't know how to generate an HTTP DELETE. 
// Fortunately, sMash/Zero will interpret an HTTP POST with 
// an X-Method-Override: DELETE header as a DELETE. 
deleteTodoHS.headers['X-Method-Override'] = 'DELETE';

gì đang xảy ra ở đây? máy chủ web của IBM chặn và diễn giải "POST with DELETE" dưới dạng DELETE.

Vì vậy, tôi đào sâu hơn và tìm thấy điều này post and discussion with Don Box (một trong những kẻ SOAP gốc). Rõ ràng đây là một hành vi khá chuẩn kể từ khi một số trình duyệt, vv không hỗ trợ PUT và DELETE, và là một công việc xung quanh đã được khoảng một thời gian. Đây là một đoạn trích, nhưng có nhiều cuộc thảo luận hơn.

"Nếu tôi đang xây dựng ứng dụng khách GData, tôi tự hỏi tại sao tôi lại bận tâm sử dụng phương thức DELETE và PUT cho rằng X-HTTP-Method-Override sẽ hoạt động trong nhiều trường hợp/triển khai hơn."

Tôi lấy đi điều này là nếu mặt web của bạn hỗ trợ tiêu đề X-Method-Override này, thì bạn có thể sử dụng phương pháp này. không khẳng định rằng chưa

Một vấn đề khác nảy sinh xung quanh việc có thể đọc các tiêu đề HTTP response Một lần nữa, từ a blog post in 2007 by Nathan de Vries, chúng tôi thấy điều này thảo luận Ông đã theo dõi rằng bài viết trên blog và thảo luận với lời nhận xét riêng của mình:...

"Sự thay đổi duy nhất trên mặt trận web là các phiên bản mới hơn của Flash Player (chắc chắn là những upplied với Flex 3 beta) bây giờ hỗ trợ tài sản responseHeaders trên trường hợp của HTTPStatusEvent. "

Tôi hy vọng rằng có nghĩa là nó không phải là vấn đề bây giờ.

+0

Tôi nghĩ rằng cũng rất quan trọng để tự hỏi liệu khách hàng sử dụng "X-HTTP-Method-Override" mất một số lợi ích của REST. Cách tiếp cận này có thực sự khác với đường hầm qua HTTP không? Bạn không bị mất khả năng tận dụng proxy caching và các lợi ích khác như vậy? – Gili

+0

Nếu bạn nhìn vào đây http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html tại phần 13.10 bạn sẽ thấy rằng PUT, DELETE và POST tất cả đều làm cho mục nhập bộ nhớ cache bị vô hiệu. Vì vậy, bất kể bạn sử dụng đúng động từ hoặc POST cộng với X-HTTP-Method-Override, bạn sẽ có tác dụng tương tự trên bộ nhớ cache. –

+0

@Gili Để trả lời câu hỏi đầu tiên của bạn, không bạn không mất bất kỳ lợi ích nào của REST. –

5

Có những thiếu sót nhất định về khả năng của Flex hoạt động như một máy khách RESTful thuần túy.

Các ý kiến ​​dưới đây là từ blog này:

Vấn đề là HTTPService lớp có một số hạn chế lớn:

  1. Chỉ phương thức GET và POST được hỗ trợ ra khỏi hộp (trừ khi bạn sử dụng FDS và đặt thuộc tính useProxy thành đúng)
  2. Không thể đặt tiêu đề yêu cầu và không có quyền truy cập để phản hồi tiêu đề. Do đó, tôi không thể truy cập nội dung phản hồi trong trường hợp lỗi.
  3. Dịch vụ HTTPService nhận mã trạng thái bất kỳ điều gì khác 200, nó xem xét lỗi. (sự kiện 201, ouch !!). FaultEvent không cung cấp thông tin về mã trạng thái bất kỳ phản hồi nào nội dung. Khách hàng Flex sẽ không có ý tưởng điều gì đã xảy ra.

Matt Raible cũng đã đưa ra một nice presentation on REST with Rails, Grails, GWT and Flex rằng có một số tài liệu tham khảo tốt liên kết từ nó.

Cho dù đó là khả thi hay không thực sự phụ thuộc vào bao nhiêu bạn sẵn sàng để làm việc xung quanh bằng proxy vv

+0

Nếu những giới hạn này là chính xác thì Flex là không khởi động cho REST trên http. Việc có thể truy cập tất cả các tiêu đề HTTP là rất quan trọng. –

0

Trên thực tế đã đang sử dụng Flex với một khung Rest-Style. Như mbrevort đã đề cập đến phương pháp PUT và DELETE không thể được sử dụng trực tiếp. Thay vào đó, chúng tôi đang thực hiện PUT thông qua POST và DELETE, chúng tôi đang sử dụng GET trên tài nguyên có tham số URL như? Action = delete.

Đây không phải là 100% Kiểu còn lại, vì vậy tôi không chắc chắn, nếu điều này làm việc với triển khai JSR 311. Bạn sẽ cần một số tính linh hoạt ở phía máy chủ để giải quyết các hạn chế PUT và DELETE.

Liên quan đến xử lý lỗi, chúng tôi đã triển khai dịch vụ lỗi. Trong trường hợp lỗi phía máy chủ, ứng dụng Flex có thể truy vấn dịch vụ lỗi này để nhận được thông báo lỗi thực tế. Điều này cũng linh hoạt hơn nhiều so với việc chỉ ánh xạ các mã trả về HTTP cho các thư tĩnh.

Tuy nhiên, nhờ tập lệnh ECMA của Flex hoạt động với các dịch vụ REST dựa trên XML rất dễ dàng.

+1

là RPC qua HTTP và thậm chí không gần với REST –

+0

Vâng, phần nào ở giữa thực tế. REST có 4 phương thức và hai trong số chúng phải được thực hiện khác nhau vì các động từ HTTP bắt buộc không có sẵn. – Yaba

1

Tôi đang làm việc ngay bây giờ trên một ứng dụng mà chủ yếu dựa trên REST gọi giữa Flex và JavaScript và Java Servlets. Chúng tôi gặp phải vấn đề về mã lỗi phản hồi bằng cách thiết lập quy ước về mã trạng thái < id = "XXX" name = "YYYYYY" > bị trả lại do lỗi, với ID lỗi gần như ánh xạ tới mã lỗi HTTP.

Chúng tôi nhận được xung quanh giới hạn tập lệnh chéo trang web bằng cách sử dụng Java Servlet làm proxy HTTP. Các cuộc gọi đến proxy (chạy trên cùng một máy chủ phục vụ phần còn lại của nội dung, bao gồm nội dung Flex, gửi yêu cầu đến máy chủ khác, sau đó gửi phản hồi lại cho người gọi ban đầu.

6

Như nhiều người đã chỉ ra HTTPService là một chút đơn giản và không làm tất cả những gì bạn muốn làm. Tuy nhiên, HTTPService chỉ đường trên đầu trang của flash.net.* lớp như URLLoader, URLRequestURLRequestHeader. Sử dụng những bạn có thể lắp ráp hầu hết các yêu cầu HTTP.

Khi nói đến hỗ trợ cho các phương pháp khác hơn GET và POST vấn đề chủ yếu nằm ở chỗ một số trình duyệt (ví dụ Safari) không hỗ trợ các trình duyệt này và Flash Player dựa trên trình duyệt cho tất cả đó là mạng.

0

REST là một ý thức hệ hơn bất cứ điều gì. Bạn đi đến các bài thuyết trình REST và họ có máy rút coolaide.

Đối với các ứng dụng Flex, việc cuộn ngăn xếp kết hợp với BlazeDS và dữ liệu AMF marshalling thuận tiện hơn và hiệu quả hơn.

+2

Wow, tuyệt vời, hãy cho tôi biết thêm. Tôi yêu Koolaid. BTW, "hiệu quả hơn" so với cái gì? –

0

Con đường tôi đã quản lý này trong quá khứ là sử dụng một proxy PHP mà giao dịch với các cuộc gọi dịch vụ web từ xa và trả RTU JSON cho khách hàng ..

3

Tôi đã làm việc trên một mã nguồn mở thay thế cho thành phần HTTPService hỗ trợ đầy đủ REST. Nếu quan tâm, bạn có thể tìm thấy phiên bản beta (mã nguồn và/hoặc biên soạn Flex chia sẻ runtime thư viện) và hướng dẫn tại đây:

http://code.google.com/p/resthttpservice/

1

RestfulX có giải quyết hầu hết/tất cả các vấn đề REST với Flex. Nó có hỗ trợ cho Rails/GAE/Merb/CouchDB/AIR/WebKit, và tôi chắc chắn nó sẽ là một snap để kết nối nó với việc thực hiện Java của bạn.

Dima cũng tích hợp Thư viện AS3HTTPClient vào nó.

Hãy khám phá!

2

Câu trả lời ngắn gọn là có, bạn có thể thực hiện RESTful with Flex. Bạn chỉ phải làm việc xung quanh các giới hạn của trình phát Flash (tốt hơn với các phiên bản mới nhất) và các giới hạn ngăn xếp HTTP của trình duyệt chứa.

Chúng tôi đã thực hiện phát triển RESTful client trong Flex hơn một năm sau khi giải quyết tiêu đề yêu cầu HTTP cơ bản và thiếu PUT và DELETE thông qua phương thức rhod-esque? _method = approach. Tacky có lẽ, nhưng nó được công việc làm.

tôi lưu ý một số cơn đau đầu trong một bài đăng trên blog cũ tại http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html

+0

method = xxx là RPC không REST –

+0

mờ: bạn đang thiếu điểm. _method = hack là cần thiết để đối phó với các trình duyệt (và Flash Player) mà không thể thực sự thực hiện các cuộc gọi PUT và DELETE thực. Rails đã sử dụng cùng một cách giải quyết ... – verveguy

0

Cuốn sách Flexible Rails có thể hữu ích - Nó là một nguồn tuyệt vời về cách sử dụng Flex như một khách hàng RESTful. Mặc dù tập trung vào việc sử dụng Flex với khung Rails, tôi tin rằng các khái niệm này áp dụng cho bất kỳ khung công tác RESTful nào. Tôi đã sử dụng cuốn sách này để tăng tốc nhanh chóng bằng cách sử dụng Flex với REST.

2

Hỗ trợ Flex cho REST yếu nhất. Tôi đã dành rất nhiều thời gian để xây dựng một nguyên mẫu để tôi biết hầu hết các vấn đề.Như đã đề cập trước đó, ngoài hộp chỉ có hỗ trợ cho GET và POST. Thoạt nhìn, có vẻ như bạn có thể sử dụng cấu hình proxy trong LiveCycle Data Services hoặc Blaze để nhận hỗ trợ cho PUT và DELETE. Tuy nhiên, một giả mạo của nó. Yêu cầu đến từ ứng dụng Flex của bạn sẽ vẫn là POST. Proxy chuyển đổi nó thành PUT hoặc DELETE ở phía máy chủ để lừa mã phía máy chủ của bạn. Có những vấn đề khác nữa. Nghe tin rằng đây là điều tốt nhất mà Adobe có thể nghĩ ra. Sau khi đánh giá của tôi, chúng tôi quyết định đi theo một hướng khác.

0

Tôi làm việc trên một dự án lớn flex cho Franklin Covey. Chúng tôi sử dụng các dịch vụ REST. Để hỗ trợ điều này. Chúng tôi đã tạo một trình bao bọc XMLHttpRequest. Bằng cách sử dụng giao diện bên ngoài với một số trình xử lý sự kiện. Chúng tôi đã mở thư viện. Bạn có thể kiểm tra xem nó ra tại https://github.com/FranklinCovey/AS3-XMLHttpRequest

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