2011-08-24 28 views
26

Tôi muốn sử dụng Backbone.js với điều khiển REST api I. Tôi đã hy vọng có REST api và các kịch bản Backbone sống trên một miền khác nhưng tiếc là điều này sẽ bị chặn, vì nó là một yêu cầu miền chéo.JSONP và Backbone.js

Backbone.js có chức năng tích hợp sẵn để hỗ trợ các yêu cầu JSONP không? Hoặc, cách khác, có ai có kinh nghiệm với việc thêm hỗ trợ JSONP theo cách thủ công vào hệ thống Backbone.js sync không?

Trả lời

20

Bạn sẽ không thể sử dụng toàn bộ REST API của mình với JSONP. Bạn chỉ có thể gọi các yêu cầu GET với JSONP (nó hoạt động bằng cách viết một thẻ <script> mới trên tài liệu hiện tại, sau đó gọi một cuộc gọi lại javascript ...).

Để sử dụng tất cả động từ HTTP (POST, DELETE, PUT), bạn có thể sử dụng giao thức CORS: http://www.w3.org/TR/access-control/.

CORS là một giao thức đàm phán giữa trình duyệt và một dịch vụ web mà nói với trình duyệt mà nó là “OK” để thực thi mã Javascript từ một cuộc gọi cross-domain

Để sử dụng, bạn chỉ cần bao gồm một số tiêu đề tùy chỉnh trong phản hồi của máy chủ cho trình duyệt biết rằng chấp nhận yêu cầu miền chéo là chấp nhận được. Đây là một bài đăng trên blog giải thích cách triển khai nó với RubyOnRails (nhưng nó hoàn toàn tương tự với các khung công tác khác ...): http://www.tsheffler.com/blog/?p=428

Đây là giải pháp đơn giản nhất, bạn có thể sử dụng backbone.js và nó hoạt động với hầu hết các trình duyệt hiện tại (Internet Explorer 8+, Firefox 3.5+, Safari 4+ và Chrome)!

Nếu bạn cần hỗ trợ trình duyệt cũ, tôi đã quản lý để làm cho công việc xương sống bằng easyXDM:

easyXDM là một thư viện Javascript cho phép bạn như là một nhà phát triển dễ dàng khắc phục hạn chế thiết lập tại chỗ bởi các Same Chính sách xuất xứ, lần lượt giúp dễ dàng giao tiếp và hiển thị javascript API trên các ranh giới miền.

Đó là một chút phức tạp hơn, và làm việc với một số hacks nổi tiếng iframe (mà đôi khi được sử dụng trong các widget javascript như GMaps, facebook widget, ...).

Hy vọng trợ giúp này!

+1

CORS không hoạt động khi được sử dụng từ tệp: // url. – sunkencity

+1

Theo [liên kết này từ microsoft] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx), hỗ trợ CORS bị hạn chế trong IE8/9 và không sử dụng XMLHttpRequest, nó sử dụng đối tượng XDomainRequest.Một số điểm nổi bật (lowlights): chỉ có thể sử dụng GET/POST, không có tiêu đề tùy chỉnh, yêu cầu loại nội dung sẽ luôn là văn bản/đồng bằng, không thể gửi cookie xác thực theo yêu cầu, cả hai đều phải cùng một lược đồ http (ví dụ http & http hoặc https & https), –

35

Hỗ trợ JSONP cho các hoạt động GET có thể được thêm thông qua tùy chọn của fetch.

Trong băm cùng nơi bạn cấu hình successerror bạn xử lý, thêm một đối tượng như vậy:

{dataType: "jsonp"}

này sẽ vượt qua cùng tùy chọn jsonp để xử lý ajax JQuery, và Automagically, bạn sẽ có hỗ trợ JSONP để truy xuất các mô hình/bộ sưu tập.

+2

Câu trả lời hay hơn IMO. – htmldrum

+1

Rất tiếc, điều này chỉ tốt cho các yêu cầu GET, không phải là API RESTful đầy đủ như câu hỏi được đề xuất. – tyler