Câu trả lời:
Đây là một câu hỏi khá rộng, và có thể đảm bảo cho chính wiki. Cũng có khá nhiều thông tin trên google về cả hai, nhưng tôi nghĩ tôi có thể nhấn mạnh một vài điểm chính.
Nếu cả hai đều không phải là mối quan tâm, tôi sẽ chỉ đi với bất cứ điều gì dễ dàng nhất hoặc quen thuộc nhất với bạn. Nếu nó là một sự cố, hãy thử CORS, vì nó là giải pháp "hiện đại" hơn và JSONP thiên về hack, biến dữ liệu thành các tập lệnh để vượt qua các hạn chế miền chéo. Tuy nhiên, CORS thường yêu cầu nhiều cấu hình phía máy chủ hơn.
Nếu bạn đang sử dụng jQuery, tôi không chắc bạn đang nảy ra ý tưởng từ đâu rằng CORS " thân thiện hơn nhiều với khách hàng và dễ triển khai hơn ." Xem https://gist.github.com/3131951 . jQuery tóm tắt các chi tiết của JsonP và CORS thực sự có thể hơi phức tạp khi cấy vào phía máy chủ của bạn tùy thuộc vào công nghệ bạn đang sử dụng.
Gần đây tôi đã phát triển một ứng dụng web, sử dụng jquery và backbone.js, ứng dụng này đọc từ các dịch vụ web đa miền khác nhau mà chúng tôi kiểm soát và cuối cùng sử dụng Json-P thay vì CORS vì chúng tôi cần hỗ trợ IE7 và nó đơn giản hơn một chút. phía máy chủ (chúng tôi chạy Django w / DjangoRestFramework) và hầu như tương tự với jquery ở phía máy khách.
Bạn đang ở vị trí đẹp. Nếu bạn không phải hỗ trợ các trình duyệt cũ (những trình duyệt được phát hành hơn 6 năm trước), tôi chắc chắn sẽ sử dụng CORS.
CORS dễ triển khai hơn, trong đó nếu API của bạn chưa hỗ trợ JSONP hoặc CORS, thì việc thêm một vài tiêu đề tĩnh sẽ dễ dàng hơn là sửa đổi nội dung phản hồi.
Ngoài ra, việc lưu vào bộ nhớ cache các yêu cầu bằng CORS cũng dễ dàng hơn. Mỗi yêu cầu JSONP cần phải động ngay cả với nội dung memcached.
JSONP vẫn là một thẻ script, vì vậy bất kể điều gì, nó sẽ gây ra một số mức độ hành vi đồng bộ. CORS sẽ không.
JSONP chỉ có thể là GET. Và như với CORS, bạn có thể sử dụng bất kỳ phương pháp nào.
Cuối cùng nhưng không kém phần quan trọng, nếu bạn đang sử dụng jQuery v1.x , hãy cân nhắc rằng error
và complete
(hoặc tốt hơn fail
và always
) các trình xử lý vẫn không được gọi cho các yêu cầu JSONP trong một số trường hợp phổ biến (ví dụ: lỗi mạng). Chắc chắn có những cách giải quyết (cài đặt thời gian chờ, plugin jQuery-JSONP), nhưng tôi thấy CORS ít gây phiền nhiễu hơn, đặc biệt khi các yêu cầu tên miền chéo chỉ đến từ thiết bị di động (tức là ứng dụng kết hợp), vì vậy bạn không cần hỗ trợ cho các trình duyệt kém may mắn.
Theo Spring Documentation, JSONP là một cuộc tấn công và không phải là giải pháp thích hợp của Chia sẻ tài nguyên nguồn gốc chéo. Vì vậy, nếu vấn đề bảo mật không phải là mối quan tâm của bạn thì bạn chỉ cần kiểm tra nguồn gốc miền trên máy chủ của mình và thêm tiêu đề Access-Control-Allow-Origin Response.
API Web của chúng tôi không hoạt động trên Safari (iOS 9.1) với Xác thực Windows. Nó đã hoạt động với Safari + iOS 8.4. Khi chúng tôi đổi sang JSONP, Safari bắt đầu hoạt động trở lại. Kiểm tra liên kết này để biết thêm thông tin.