Nếu Javascript chỉ được phép truy cập các tập lệnh từ cùng một tên miền, làm thế nào một trang web có thể tạo các bản mashup phải đọc và sửa đổi nội dung từ một tên miền khác?
Nếu Javascript chỉ được phép truy cập các tập lệnh từ cùng một tên miền, làm thế nào một trang web có thể tạo các bản mashup phải đọc và sửa đổi nội dung từ một tên miền khác?
Câu trả lời:
Nếu API bạn đang cố truy cập hỗ trợ JSONP , bạn chỉ phải cung cấp tên hàm javascript trong yêu cầu của mình, thì JSONP trả về javascript giống như myfunc({the:data});
bạn có thể chạy như một javascript thông thường, đó là lý do tại sao bạn sẽ tạo một <script src="www.website.com/somecall?jsonp=myfunc">
thẻ mới để "gửi yêu cầu" (jQuery thực hiện điều này tự động nếu bạn sử dụng type: jsonp
trong $.ajax
các yêu cầu).
Nhược điểm là nó yêu cầu nhà cung cấp API hỗ trợ JSONP.
Flash có thể truy cập nội dung tên miền chéo miễn là trang web mục tiêu có crossdomain.xml
tệp gốc của nó cho biết nó cho phép, thường là trường hợp trên các máy chủ cung cấp API).
Nhược điểm là nó yêu cầu Flash trong trình duyệt của người dùng và trang web bạn nhận dữ liệu phải có tệp crossdomain.xml cho phép yêu cầu tên miền chéo.
Các ngôn ngữ phía máy chủ như PHP không có giới hạn cùng tên miền của BS, vì vậy bạn có thể có một tập lệnh hoạt động như proxy (ví dụ: tải xuống qua một trong các tiện ích mở rộng http như cURL).
Lợi ích bổ sung là bạn có thể dọn sạch dữ liệu (hoặc thậm chí trộn nhiều nguồn) trên máy chủ, trước khi chuyển tiếp nó đến trang web / javascript của bạn, do đó bạn thậm chí chỉ có thể trích xuất phần hữu ích của dữ liệu, rất hay khi làm webapp trên thiết bị di động nơi băng thông có thể là một vấn đề.
Nhược điểm là tất cả các yêu cầu phải đi qua máy chủ của bạn, do đó làm tăng tải trên máy chủ của bạn.
Tuy nhiên, lợi ích là nó sẽ hoạt động với bất kỳ nguồn tài nguyên nào vì nó không yêu cầu mục tiêu hỗ trợ tên miền chéo hoặc jsonp. Vì vậy, nếu không có gì khác làm việc, điều này sẽ.
Internet Explorer có yêu cầu tên miền chéo
Firefox 3.5+ có tiêu chuẩn chia sẻ nguồn gốc chéo , nhưng nó yêu cầu nguồn tài nguyên mà bạn đang cố truy cập để bao gồm các tiêu đề đặc biệt, ví dụ như trong PHP:
header("content-type: Access-Control-Allow-Origin: *");
header("content-type: Access-Control-Allow-Methods: GET");
Một vài trình duyệt chính khác cũng hỗ trợ điều này , vì vậy nếu bạn không cần hỗ trợ các trình duyệt cũ và nếu bạn có thể nhận được các nguồn tài nguyên mà bạn đang cố truy cập để gửi các tiêu đề đó, thì đây có thể là lựa chọn tốt nhất của bạn, nếu không thì phía máy chủ kịch bản sẽ là đề nghị của tôi.
Firefox cũng có cài đặt người dùng capability.policy.default.XMLHttpRequest.open
, nhưng tôi sẽ không tin người dùng thay đổi cài đặt trong trình duyệt của mình.
Bạn có thể sử dụng API (của một tên miền khác) cho điều đó. Javascript của bạn sẽ gọi tệp PHP (hoặc tệp tập lệnh khác) trên máy chủ web của bạn (tên miền của bạn), sẽ gọi API (của một tên miền khác sử dụng CURL) và nhận được phản hồi cho bạn.