Việc gọi lại là một chức năng BẠN 'VE được định nghĩa trong mã của riêng bạn. Máy chủ jsonp sẽ bọc trả lời của nó bằng một cuộc gọi hàm có tên giống như hàm gọi lại được chỉ định của bạn.
gì xảy ra nó này:
1) Mã của bạn tạo ra các yêu cầu JSONP, mà kết quả trong một <script>
khối mới trông như thế này:
<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>
2) Đó thẻ script mới được thực hiện bởi trình duyệt của bạn, dẫn đến yêu cầu đến máy chủ JSONP.Nó phản ứng với
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
3) Kể từ khi yêu cầu này xuất phát từ một thẻ script, nó khá nhiều CHÍNH XÁC giống như nếu bạn muốn theo nghĩa đen đặt
<script>
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>
vào trang của bạn. Bây giờ tập lệnh mới này đã được tải từ máy chủ từ xa, tập lệnh này sẽ được thực thi và điều duy nhất nó sẽ thực hiện là gọi hàm, parseResponse()
, chuyển dữ liệu JSON làm tham số duy nhất của cuộc gọi chức năng .
Vì vậy, ở một nơi khác trong mã của bạn, bạn phải:
function parseResponse(data) {
alert(data.Name); // outputs 'Foo'
}
Về cơ bản, JSONP là một cách để bỏ qua chính sách bảo mật kịch bản cùng nguồn gốc của trình duyệt, bằng việc có một máy chủ của bên thứ 3 tiêm một cuộc gọi chức năng trực tiếp vào trang của bạn. Lưu ý rằng điều này là do thiết kế rất không an toàn. Bạn đang phụ thuộc vào dịch vụ từ xa là đáng kính và không có ý định độc hại. Không có gì ngăn cản một dịch vụ xấu từ trả lại một số mã JS đánh cắp ngân hàng/facebook của bạn/bất kỳ thông tin đăng nhập nào. ví dụ: phản hồi JSONP có thể là
internalUseOnlyFunction('deleteHarddrive');
thay vì parseReponse (...). Nếu trang web từ xa biết cấu trúc mã của bạn, nó có thể thực hiện các hoạt động tùy ý với mã đó, bởi vì bạn đã mở cửa trước mở rộng để cho phép trang web đó làm bất cứ điều gì nó muốn.
có thể trùng lặp [Vui lòng giải thích JSONP] (http://stackoverflow.com/questions/2067472/please-explain-jsonp) – Jon