2010-09-23 24 views
10

Có vẻ như mọi người đã gặp sự cố với Chấp nhận tiêu đề trong quá khứ, nhưng tôi không chắc chắn vấn đề của tôi có liên quan hay không. Sử dụng jQuery 1.4.2, tôi gặp sự cố khi nhận JSON với getJSON(). Tôi có thể xem yêu cầu/phản hồi trong Firebug và có vẻ như nguồn của sự cố là tài nguyên được đề cập trả về các kết quả khác nhau tùy thuộc vào tiêu đề Chấp nhận. Mặc dù các tài liệu nói rằng nó nên được thiết lập, trong Firebug nó xuất hiện là "/" - rõ ràng, tôi muốn "ứng dụng/json". Đây có phải là một lỗi được biết đến? Tôi có nên thiết lập một số lá cờ tôi không biết?getJSON() của JQuery không thiết lập chấp nhận tiêu đề chính xác?

ETA: Yêu cầu là cross-site, nếu có vấn đề, nhưng tôi đang chuyển một tham số truy vấn callback=? để JQuery (thành công!) Coi nó là JSONP. Dịch vụ tôi gọi trong trường hợp cụ thể này hỗ trợ tham số truy vấn ghi đè chấp nhận (&accept=application/json), vì vậy tôi đã làm cho nó hoạt động theo cách thủ công, nhưng tôi vẫn xem xét tiêu đề trục trặc là lạ và hy vọng tôi có thể sửa lỗi, vì vậy tôi không gặp phải vấn đề này một lần nữa khi giao dịch với một dịch vụ khác có thể không được tha thứ như vậy. Tôi không có một cách dễ dàng sao chép/dán mã từ môi trường phát triển của tôi, nhưng đây là ý chính:

$.getJSON(baseURL + "?item=" + itemNum + "&callback=?", function(data){ 
    console.log(data); 
} 

Như bạn có thể thấy, đây là không chính xác phức tạp, và nên (tôi 99 % chắc chắn ...) dẫn đến XHR được gửi với tiêu đề Chấp nhận là application/json. Như tôi đã nói, điều đó không xảy ra, trên mỗi giao diện điều khiển Net của Firebug. Nếu nó quan trọng, đây là trong Firefox 3.6.8.

ETA Một lần nữa: Đối với bất cứ ai vẫn đọc điều này, có, nó vẫn đang xảy ra, và không, tôi không biết tại sao. Như tôi đã nói, lệnh getJSON() đơn giản, cú pháp thực sự cơ bản, trang web chéo, được coi là JSONP bởi vì nó bao gồm tham số truy vấn gọi lại. Vẫn mở để gợi ý!

+1

Hiển thị mã cho chúng tôi và chúng tôi có thể giúp bạn nhiều hơn. – Steven

+0

Tôi gặp vấn đề tương tự trong Chrome 8. $ .getJSON ("url", hàm (dữ liệu) {}) đang đặt tiêu đề Chấp nhận thành */* –

Trả lời

13

Đây không phải là lỗi.

Vì cuộc gọi của bạn là tên miền chéo, trình duyệt của bạn sẽ không cho phép bạn thực hiện cuộc gọi XHR (chính sách cùng nguồn gốc). Bên trong, jQuery đang làm việc xung quanh việc này bằng cách sử dụng "hack <script>", để thực hiện cuộc gọi tên miền chéo (đây là ý tưởng mang tính nền tảng đằng sau loại dữ liệu JSONP). Do cuộc gọi được thực hiện bằng cách sử dụng thẻ, jQuery không thể sửa đổi phần accepts của tiêu đề.

jQuery hoạt động phép thuật của mình bằng cách ẩn các chi tiết này khỏi bạn, nhưng rất tiếc trong trường hợp này bạn dường như phải tuân theo Law of Leaky Abstractions.

+0

Câu trả lời rất sâu sắc –

2

Nếu không thấy mã của bạn (có thể đưa chúng ta đến giải pháp rõ ràng), bạn có thể thử sử dụng hàm Ajax chuẩn và xem bạn có nhận được kết quả khác không?

$.ajax({ 
    url: '/what.eva', 
    dataType: 'json', 
    data: '{}', 
    success: callbackFunc 
}); 

function callbackFunc(result) { 
    alert(result); 
} 
+0

Tôi đã thử những gì bạn đề xuất, thay thế cuộc gọi getJSON của tôi (chi tiết bây giờ được liệt kê trong câu hỏi chính) với lời gọi $ .ajax và kết quả giống hệt nhau. Tôi thấy điều này phải là một lỗi đã biết, hoặc có thể nó chỉ là trình duyệt của tôi là lạ, nhưng điều này chắc chắn chạy ngược lại với hành vi mong đợi. – Coderer

2

Đây là lỗi đã bị đóng trên trang web jquery.

http://dev.jquery.it/ticket/6551

Có không xuất hiện để có cách khắc phục cho điều này được nêu ra.

+0

Ồ, vì vậy ai đó có vấn đề, nhưng họ không thể tái sản xuất để họ đóng nó? Tôi sẽ xem liệu tôi có thể đóng góp cho nó không, bằng cách nào đó ... – Coderer

+0

Trong trường hợp bạn tò mò: vé đã được giải quyết và câu trả lời của Pete là đúng - ngay cả khi nó * trông * giống như yêu cầu AJAX "bình thường" (XHR), nó được thực hiện với một thẻ '