2010-07-28 41 views
23

Tôi đang sử dụng jquery để xây dựng một yêu cầu tới API tìm kiếm Twitter. Tôi đang sử dụng jsonp, như là cần thiết cho các yêu cầu miền chéo. Tuy nhiên, API Twitter chỉ định rằng bạn nên đặt một User-Agent duy nhất cho các yêu cầu này và giới hạn các yêu cầu của bạn nếu bạn không yêu cầu. Vấn đề là, tôi thấy không có cách nào để thiết lập tiêu đề này thông qua jquery.Sửa đổi tiêu đề HTTP cho một yêu cầu JSONP

Đây là mã tôi đang sử dụng:

$.ajax({ 
    url: 'http://search.twitter.com/search.json', 
    dataType: 'jsonp', 
    type: 'get', 
    data: { q: 'twitter' }, 
    success: function(data) { 
     alert(data.results); 
    } 
}); 

Tôi đã thử bằng cách sử dụng phương pháp beforeSend, nhưng có vẻ như sự kiện này không được bắn. Bất cứ ai có thể đưa ra bất kỳ cách nào để giải quyết vấn đề này?

Cảm ơn.

Trả lời

52

JSON với Padding hoạt động bằng cách thêm phần tử tập lệnh vào trang, với thuộc tính src trỏ đến URL của dịch vụ web. Các dịch vụ web sau đó trả về một kịch bản có chứa dữ liệu được bao bọc trong một hàm gọi lại được thực hiện khi kịch bản lệnh kết thúc phân tích cú pháp. Nó không phải là quá nhiều JSON (nó thậm chí không phải là JSON hợp lệ, để bắt đầu) vì nó là JavaScript thuần túy.

Không có cách nào để sửa đổi tiêu đề được gửi cho phần tử tập lệnh được thêm vào trang của bạn, thật không may. Điều duy nhất bạn có thể làm là kiểm tra một phương pháp tương thích chéo nguồn gốc của dữ liệu lấy, chẳng hạn như:

  • XMLHttpRequest Level 2 - Chrome, Safari 4+, Firefox 3.5+, Opera

    // Is XMLHttpRequest Level 2 supported? 
    if ("withCredentials" in new XMLHttpRequest())
  • XDomainRequest - cho IE 8, IE 9

    // Is XDomainRequest supported? 
    if ("XDomainRequest" in window)

Nó sẽ là một ý tưởng tốt để kiểm tra các triển khai này nếu chúng tồn tại và sử dụng chúng tương ứng, quay trở lại JSONP chuẩn cho các trình duyệt không được hỗ trợ hoặc cũ hơn. Cũng có thể (nhưng không chắc, vì đó là cấu hình cao) rằng dịch vụ web không được thiết lập để cho phép các yêu cầu gốc xuất phát, vì vậy bạn có thể vẫn phải quay lại JSONP nếu yêu cầu không thành công. Xem thêm, Cross-Origin Resource Sharing.

+1

1 đẹp câu trả lời chi tiết với các thông tin hữu ích :) – Sarfraz

+1

Ah, đó là vô cùng đáng tiếc. Tôi nghĩ rằng tôi sẽ rơi trở lại bằng cách sử dụng một kịch bản wrapper được viết bằng PHP mà đi ra ngoài và lấy dữ liệu. Bằng cách đó, tôi có thể cache tìm kiếm, vì vậy có thể đó là một chiến thắng-thắng (mặc dù nó có nghĩa là nhiều công việc hơn). Cảm ơn câu trả lời chi tiết. –

0

Hãy thử điều này:

// OAuth configurations 
    var config = { 
     'client_id': 'xxxxxx.apps.googleusercontent.com', 
     'scope': 'https://www.google.com/m8/feeds/contacts/default/full'   
    }; 

gapi.auth.authorize(config, function(data) { 
     // login complete - now get token 
     var token = gapi.auth.getToken(); 
     token.alt = 'json'; 
     // retrieve contacts 
     jQuery.ajax({ 
     url: 'https://www.google.com/m8/feeds/contacts/default/full/?max-results=999999', 
     dataType: 'jsonp', 
     data: token, 
     success: function(data) { successGmail(data); } 
     }); 
    }); 

tôi tìm thấy nó ở đó: https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J

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