2011-12-16 26 views
18

Một số dịch vụ dữ liệu JSON trên Internet được thiết kế để chỉ được các máy chủ sử dụng và bỏ bê khả năng bị ứng dụng chỉ dùng trên web trực tiếp sử dụng.Tôi làm cách nào để sử dụng JSON trên trang web từ một nguồn không có cả CORS lẫn JSONP?

Do mối quan ngại giữa các trang, các dịch vụ đó sẽ hoạt động nếu chúng cung cấp định dạng JSONP hoặc bật hỗ trợ CORS.

Tôi muốn tạo một công cụ JavaScript nhỏ có thể gọi một tài nguyên trực tuyến chỉ trả lại JSON và không, và không hỗ trợ.

Một trường hợp mẫu là một ứng dụng một trang mà tôi đã thực hiện mà nguồn dữ liệu duy nhất tôi có thể tìm thấy không cung cấp CORS hoặc JSONP. Là một ứng dụng một trang, nó không có máy chủ riêng của mình nên phải tuân thủ chính sách cùng nguồn gốc.

Chiến lược nào có sẵn trong các trường hợp như vậy?

Trả lời

35

** Một cách là tìm một proxy có thể truy cập vào một nguồn JSON dữ liệu và sau đó phục vụ cho ứng dụng web của bạn chuyển đổi để làm việc với JSON, CORS, hoặc bất kỳ định dạng khác mà bạn có thể xử lý mà không cần lo lắng về cross-site mối quan tâm.

Một proxy như vậy là Yahoo's "YQL".

YQL hỗ trợ cả JSONP và CORS.

Vì vậy, nếu trình duyệt của bạn cũng hỗ trợ CORS, bạn có thể coi đó là một máy chủ proxy JSON miễn phí JSON. Nếu không, sau đó nó cũng là một JSON tự do JSONP proxy:

Dưới đây là một ví dụ về cách tôi đã sử dụng nó với jQuery:

$.getJSON("http://query.yahooapis.com/v1/public/yql", 
    { 
    q:  "select * from json where url=\"http://airportcode.riobard.com/airport/" + code + "?fmt=JSON\"", 
    callback: gotJSON, // you don't even need this line if your browser supports CORS 
    format: "json" 
    }, 
    function(data){ 
    if (data.query.results) { 
     /* do something with 
     data.query.results.json.code 
     data.query.results.json.name 
     data.query.results.json.location 
     */ 
    } else { 
     /* no info for this code */ 
    } 
    } 
); 

And a version on jsfiddle...

+0

Làm thế nào sẽ có việc làm? Bạn đang vi phạm chính sách có cùng nguồn gốc và cuộc gọi sẽ không thành công. Bạn sẽ không cần phải thực hiện một số loại gọi hàm JSONP đến YQL? –

+1

Không hề vì YQL hỗ trợ ['CORS'] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing), đây là một giải pháp thay thế tốt hơn nhiều so với JSONP vì nó sử dụng cùng giao diện XHR thay vì kịch bản- phương pháp tiêm có một số nhược điểm. YQL cũng hỗ trợ JSONP nếu bạn cần nó. Tôi sẽ cập nhật câu trả lời của mình. – hippietrail

+0

Nếu bạn thực sự muốn JSONP, bạn có thể truyền tham số 'callback' cũng như' format: 'json''. – hippietrail

Các vấn đề liên quan