JSONP

JSONP
Phần mở rộng tên file.jsonp
Kiểu phương tiệnapplication/json-p
Kiểu định dạngtrao đổi thông tin
Được mở rộng từJavaScript, JSON
Tiêu chuẩnRFC 7159, RFC 4329
Websitewww.json-p.org
(web archive)

JSONP hay là JSON với nhãn (padding) là một dạng bổ sung dựa trên nền định dạng dữ liệu JSON, một mẫu sử dụng cho phép trang yêu cầu dữ liệu từ máy chủ trong một tên miền khác. JSONP là một hướng giải quyết cho vấn đề này, hình thành dạng thay thế cho phương thức gần đây nhất có tên là Chia sẻ dữ liệu gốc đan xen (Cross-Origin Resource Sharing).

Cách hoạt động

[sửa | sửa mã nguồn]

Khi trang web có địa chỉ a.com lấy dữ liệu từ một địa chỉ khác là b.com sẽ bị giới hạn gọi là Same origin policy. Theo chính sách này thì các yêu cầu cần phải có cùng một địa chỉ (từ a.com gọi a.com). Để giải quyết vấn đề, giải pháp jsonp được đưa ra với hai bước giải quyết:

  • a.com và b.com quy định chung tham số sẽ trả về (ví dụ "callback")trên URL
  • a.com định nghĩa thực hiện (implement) hàm "callback"
  • Từ nơi gọi (a.com) dùng javascript yêu cầu (gọi) máy chủ đích (b.com) theo URL quy định ví dụ `http://myserver/getjson?callback=mycallback`[liên kết hỏng]
  • Máy chủ đích (b.com) xử lý dữ liệu, và thực hiện việc gọi hàm "callback" được truyền theo URL

Cụ thể mã hoạt động như sau

  • Phía Client (web browser)

Mã nơi gọi yêu cầu (viết với jquery):

$.ajax({
  url:"http://myserver/getjson?callback=mycallback", // lưu ý chữ mycallback = hàm phải a.com phải thực hiện,. 
                                                     // ở đây jquery tự động gán vào hàm success,
  data: {"userid": "1234"}, // tùy chọn
  dataType: 'json', 
  success:function(j){
   alert("Success:" +j); // hàm "f"
  },
  error:function(a, b){
   alert("Error");
 }
});
  • Phía Server

Lưu ý: Server phải lấy tham số callback gọi từ client

Mã server trả lời (python)

# 1. lấy tên hàm callback
f = self.request.params.get('callback') # hàm f
# 2. trả lời với dữ liệu json {'a':1}
self.response.out.write(cb+"({a:1})") # tương đương với việc gọi hàm f({a:1})

Mã server trả lời (PHP)

// 1. lấy tên hàm callback
$cb = $_GET['callback'] 
# 2. trả lời với dữ liệu json {'a':1}
$array = array('a'=>1);
echo $cb."(".json_encode($array).");"

Trong khi "nhãn" (tiền tố) là đặc trưng cho tên của hàm callback được định nghĩa trong việc thực thi của trình duyệt, nó cũng có thể là một biến gán, một mệnh đề điều kiện, hoặc bất cứ mệnh đề Javascript nào.

Dòng phản hồi tới một yêu cầu JSONP (hay gọi là một phản hồi theo mẫu sử dụng JSONP) không phải là JSON và không phân tích cú pháp như JSON, tải trọng trả về có thể là biểu thức Javascript nào đó và không cần bất cứ dạng JSON nào hết. Tuy nhiên, thông thường nó là đoạn mã Javascript thực hiện gọi hàm trên một vài định JSON. Hay nói cách khác, việc sử dụng một JSONP cung cấp cross-domain truy cập vào một JSON API, bằng cách đóng gói tải trọng JSON trong hàm gọi.

Vấn đề bảo mật

[sửa | sửa mã nguồn]

Các thẻ tag bao gồm trong các máy chủ kết nối cho phép các máy chủ này nhúng bất kỳ nội dung nào vào một website. Nếu máy chủ kết nối có các mối nguy hiểm mà cho phép nhúng mã JavaScript, nguy cơ máy chủ gốc bị tấn công sẽ tăng lên.

Một nỗ lực dùng để định nghĩa một tập giới hạn cho JSON-P [1] mà các trình duyệt có thể buộc các đoạn kịch bản yêu cầu với dạng MINE đó là "application/json-p". Nếu các phản hồi không phân tích cú pháp như cách các phân tích của JSON-P làm thì trình duyệt sẽ đẩy ra lỗi và bỏ qua toàn bộ dòng nội dung phản hồi.

Lịch sử

[sửa | sửa mã nguồn]

Vào tháng 7 năm 2005, George Jempty đề nghị một tùy chọn gán biến vào trước JSON.[2][3] Với đề nghị ban đầu cho JSONP, padding là một chức năng gọi lại, xuất hiện đã được thực hiện bởi Bob Ippolito trong tháng 12 năm 2005

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ "Safer cross-domain Ajax with JSON-P/JSONP". JSON-P.org. Bản gốc lưu trữ ngày 4 tháng 3 năm 2016. Truy cập ngày 30 tháng 10 năm 2011.
  2. ^ "eval'ing JSON". ngày 19 tháng 7 năm 2005. Bản gốc lưu trữ ngày 12 tháng 2 năm 2006. Truy cập ngày 14 tháng 2 năm 2012.
  3. ^ "json: Message: Re: Comments". ngày 17 tháng 8 năm 2005. Bản gốc lưu trữ ngày 22 tháng 7 năm 2012. Truy cập ngày 14 tháng 2 năm 2012.

Liên kết ngoài

[sửa | sửa mã nguồn]
Chúng tôi bán
Bài viết liên quan
Nhân vật Hiyori Shiina - Classroom of the Elite
Nhân vật Hiyori Shiina - Classroom of the Elite
Có thể mình sẽ có được một người bạn cùng sở thích. Một phần mình nghĩ rằng mình hành động không giống bản thân thường ngày chút nào, nhưng phần còn lại thì lại thấy cực kỳ hào hứng. Mình mong rằng, trong tương lai, sự xung đột giữa các lớp sẽ không làm rạn nứt mối quan hệ của tụi mình.
Cảm xúc của font chữ
Cảm xúc của font chữ
Font chữ không chỉ là công cụ thể hiện nội dung mà còn truyền tải cảm xúc và cá tính của thương hiệu hoặc thiết kế. Mỗi kiểu chữ mang một sắc thái riêng
Staff of Ainz Ooal Gown - Overlord
Staff of Ainz Ooal Gown - Overlord
Staff of Ainz Ooal Gown là Vũ khí Bang hội của Ainz Ooal Gown. Hiện tại, với vũ khí của guild này, Momonga được cho là chủ nhân của guild.
[Genshin Impact] Tại sao Eula lại hot đến vậy
[Genshin Impact] Tại sao Eula lại hot đến vậy
Bài viết sẽ tổng hợp mọi nội dung liên quan đến nhân vật mới Eula trong Genshin Impact