2012-02-11 22 views
5

Câu hỏi ngắn: có cách nào để thực hiện yêu cầu jsonp tới máy chủ, nắm bắt yêu cầu, nhưng không phân tích cú pháp dưới dạng javascript không? Tôi đang sử dụng dataType: "văn bản jsonp" trong jQuery 1.5 nhưng nó không hoạt động.gửi yêu cầu dưới dạng jsonp, giải thích câu trả lời dưới dạng văn bản, sử dụng jQuery 1.5

Tôi đang cố gắng truy cập URL tên miền chéo thông qua AJAX với jsonp. Vấn đề là các tên miền khác (một danh sách thư mục tại trường đại học của tôi) là rất cũ và tôi nghi ngờ máy chủ hỗ trợ jsonp.

  • Trong Firefox, tôi nhận được lỗi "Tên thẻ XML không phù hợp (mong đợi META)". Trong chrome, tôi nhận được "Mã thông báo không mong đợi Uncaught SyntaxError <" vừa trỏ đến tệp tương ứng với yêu cầu AJAX của tôi. Chuỗi lỗi từ cuộc gọi lại lỗi là "parsererror".
  • Tôi không thể thực hiện cuộc gọi AJAX bình thường - khi tôi thay đổi kiểu dữ liệu thành "văn bản" hoặc xóa tất cả cùng nhau, tên miền khác than phiền rằng người dùng không được xác thực và chuyển hướng đến trang đăng nhập - ngay cả khi tôi đã đăng nhập vào trình duyệt. Khi dataType là jsonp, điều này không xảy ra.
  • Tôi biết máy chủ cần hỗ trợ JSONP và tôi không nghĩ rằng nó có, nhưng khi tôi thay đổi dataType thành JSONP, tôi có thể thấy tài nguyên trang phản hồi hiển thị trong cả Chrome và Firefox - vì vậy máy chủ thực sự gửi phản hồi cho trình duyệt (trang web HTML tĩnh + một số tập lệnh java) - chứa dữ liệu tôi muốn nhận.
  • Vấn đề là jQuery đang cố gắng phân tích cú pháp phản hồi dưới dạng javascript và không thành công (vì nó không phải là javascript). Vì vậy, dữ liệu kết thúc trong trình duyệt - tôi chỉ cần truy cập vào nó!
  • Sử dụng loại dữ liệu: "văn bản jsonp" được cho là chỉ định gửi yêu cầu jsonp và diễn giải phản hồi khi văn bản không tạo ra sự khác biệt - vẫn là lỗi phân tích cú pháp.

Điều tôi muốn là: cách truy cập phản hồi từ yêu cầu jsonp dưới dạng văn bản thuần túy. Hoặc, nếu tôi có thể truy cập phản hồi thô từ một yêu cầu jsonp không thành công - điều đó cũng sẽ hoạt động.

Cảm ơn trước!

Code:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname'; 
var jqxhr = $.ajax({type:"GET", 
url: ajax_url, 
dataType:"jsonp text", 
callback: "whatever", 
success:function(responseData) { 
    $('div#content').text(responseData.slice(0, 100)); 
    dbg(responseData.slice(0,100)); 
}}) 
.success(function() { alert("success"); }) 
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);}) 
.complete(function() { alert("complete"); }); 
+0

Bạn đã thử đặt dữ liệu truy cập của bạn bằng biến js, sau đó đính kèm nó vào thẻ js. Dường như có ý nghĩa nếu nó cố phân tích cú pháp như js. –

Trả lời

8

gì bạn đang cố gắng để đạt được sẽ không làm việc: jsonp chỉ có thể được sử dụng nếu và khi máy chủ đúng cách nhúng các câu trả lời trong một cuộc gọi chức năng javascript.

Mặc dù máy chủ gửi tệp đến trình duyệt, bạn sẽ không thể truy cập tệp vì giới hạn bảo mật: tất cả những gì bạn có thể làm là thực thi dữ liệu được nói dưới dạng tập lệnh (với thẻ tập lệnh) hoặc sử dụng dưới dạng biểu định kiểu (sử dụng thẻ liên kết) nhưng bạn sẽ không bao giờ có thể kiểm tra phản hồi trong văn bản thô nếu nó từ một tên miền khác.

Tôi cho rằng bạn đã cố gắng lấy dữ liệu dưới dạng xml trực tiếp và dữ liệu không thành công (nghĩa là trang web không hỗ trợ CORS). Nếu bạn không thể thay đổi phía máy chủ mã, thì bạn chỉ có hai lựa chọn thay thế:

  1. Tạo một proxy trên máy chủ của riêng bạn để tạo đường hầm cho phản hồi (kịch bản phía máy chủ của bạn thực hiện yêu cầu thực tế và gửi đến trình duyệt): cùng một miền sẽ áp dụng theo quan điểm của khách hàng và bạn sẽ có thể yêu cầu dữ liệu dưới dạng XML,
  2. Sử dụng flash để bỏ qua bảo mật của trình duyệt (bạn có thể sử dụng flXHR nhưng có vẻ như đã được cập nhật một chút) .
+0

Cảm ơn! Than ôi, đây là những gì tôi nghi ngờ. Tôi đã đọc về CORS (máy chủ chắc chắn không hỗ trợ nó) và chính sách gốc tương tự, và nhìn lại nó có nghĩa là ngay cả khi máy chủ gửi phản hồi đến jsonp, tôi sẽ không thể kiểm tra nó. Tôi đã xem xét làm tùy chọn 1 (proxy nó thông qua máy chủ của riêng tôi) nhưng tiếc là tôi cần khách hàng được xác thực. Tôi sẽ cho flXHR một shot. Cảm ơn một lần nữa. –

+0

Về trình duyệt/flash xác thực ứng dụng khách, bạn có thể tìm thấy câu hỏi quan tâm sau: http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically –

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