JSONP là gì?
Điều quan trọng cần nhớ với jsonp là nó không thực sự là một giao thức hoặc kiểu dữ liệu. Nó chỉ là một cách tải tập lệnh nhanh chóng và xử lý tập lệnh được đưa vào trang. Theo tinh thần của JSONP, điều này có nghĩa là giới thiệu một đối tượng javascript mới từ máy chủ vào ứng dụng / tập lệnh máy khách.
Khi nào thì cần JSONP?
Đây là 1 phương pháp cho phép một miền truy cập / xử lý dữ liệu từ một miền khác trong cùng một trang một cách không đồng bộ. Về cơ bản, nó được sử dụng để ghi đè các hạn chế CORS (Chia sẻ tài nguyên nguồn gốc chéo) sẽ xảy ra với yêu cầu XHR (ajax). Tải tập lệnh không phải tuân theo các hạn chế của CORS.
Nó được thực hiện như thế nào
Việc giới thiệu một đối tượng javascript mới từ máy chủ có thể được thực hiện theo nhiều cách, nhưng thực tế phổ biến nhất là máy chủ thực hiện việc thực thi một hàm 'gọi lại', với đối tượng bắt buộc được truyền vào nó. Hàm gọi lại chỉ là một hàm bạn đã thiết lập trên máy khách mà tập lệnh bạn tải sẽ gọi vào thời điểm tập lệnh tải để xử lý dữ liệu được truyền vào nó.
Thí dụ:
Tôi có một ứng dụng ghi lại tất cả các mục trong nhà của ai đó. Ứng dụng của tôi đã được thiết lập và bây giờ tôi muốn lấy tất cả các vật dụng trong phòng ngủ chính.
Ứng dụng của tôi đang bật app.home.com
. Apis tôi cần để tải dữ liệu từ đó đang bật api.home.com
.
Trừ khi máy chủ được thiết lập rõ ràng để cho phép, tôi không thể sử dụng ajax để tải dữ liệu này, vì ngay cả các trang trên các miền phụ riêng biệt cũng phải tuân theo các hạn chế của XHR CORS.
Tốt nhất, hãy thiết lập mọi thứ để cho phép XHR miền x
Lý tưởng nhất là vì api và ứng dụng nằm trên cùng một miền, tôi có thể có quyền truy cập để thiết lập tiêu đề trên api.home.com
. Nếu tôi làm vậy, tôi có thể thêm một Access-Control-Allow-Origin:
mục tiêu đề cấp quyền truy cập vào app.home.com
. Giả sử tiêu đề được thiết lập như sau:, Access-Control-Allow-Origin: "http://app.home.com"
điều này an toàn hơn nhiều so với thiết lập JSONP. Điều này là do app.home.com
có thể có được mọi thứ nó muốn api.home.com
mà không cần api.home.com
cấp cho CORS quyền truy cập vào toàn bộ internet.
Giải pháp XHR ở trên không thể thực hiện được. Thiết lập JSONP Trên tập lệnh máy khách của tôi: Tôi thiết lập một hàm để xử lý phản hồi từ máy chủ khi tôi thực hiện lệnh gọi JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Máy chủ sẽ cần được thiết lập để trả về một tập lệnh nhỏ trông giống như "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Nó có thể được thiết kế để trả về một chuỗi như vậy nếu một cái gì đó tương tự //api.home.com?getdata=room&room=main_bedroom
được gọi.
Sau đó, khách hàng thiết lập một thẻ script như sau:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Thao tác này tải tập lệnh và ngay lập tức gọi window.processJSONPResponse()
dưới dạng được máy chủ viết / echo / in ra. Dữ liệu được chuyển vào dưới dạng tham số cho hàm hiện được lưu trữ trong dataFromServer
biến cục bộ và bạn có thể làm với nó bất cứ điều gì bạn cần.
Dọn dẹp
Một khi khách hàng có dữ liệu, tức là. ngay sau khi tập lệnh được thêm vào DOM, phần tử tập lệnh có thể bị xóa khỏi DOM:
script.parentNode.removeChild(script);