2009-07-17 26 views
72

Tôi đang cố gắng để thiết lập các tiêu đề HTTP Chấp nhận để "text/xml" với mã jquery này:có thể không đúng cách đặt tiêu đề Chấp nhận HTTP với jQuery

$.ajax({ 
    beforeSend: function(req) { 
     req.setRequestHeader("Accept", "text/xml"); 
    }, 
    type: "GET", 
    url: "[proper url]", 
    contentType: "text/plain; charset=utf-8", 
    dataType: ($.browser.msie) ? "text" : "xml", 
    username: '---', 
    password: '-------',         
    success: function(data) { 
     var xml; 
     if (typeof data == "string") { 
      alert("Data is string:" + data); 
      xml = new ActiveXObject("Microsoft.XMLDOM"); 
      xml.async = false; 
      xml.loadXML(data); 
     } else { 
      xml = data; 
      alert("Data is not string:" + $(xml).text()); 
     } 
     // Returned data available in object "xml" 
     //alert("Status is: " + xml.statusText); 
     $("#ingest_history").html($(xml).text()); 
    }    
}); 

Trong firefox nó hoạt động tuyệt vời.

Nhưng trong IE, giá trị mà tôi đang cố gắng đặt cho tiêu đề Chấp nhận dường như được nối vào cuối để nó trở thành: Accept: */*, text/xml. Điều này làm cho cuộc gọi ajax của tôi trả lại phiên bản html thay vì phiên bản xml mà tôi muốn.

Có ai biết cách đặt/xóa tiêu đề Chấp nhận đúng cách trong IE 8 không?

Đã cập nhật: Vì một số lý do các dấu hoa thị không xuất hiện khi tôi nhập chúng. Tiêu đề chấp nhận trong IE có vẻ là: Accept: */*, text/xml.

Trả lời

0

Tôi không tin rằng IE (bất kỳ phiên bản nào) sẽ phát đẹp với tiêu đề Chấp nhận. Xem liên kết này: [http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx]

Một giải pháp có thể có thể là kiểm tra Tác nhân người dùng xem liệu đó có phải là IE hay không. Nếu có, hãy kiểm tra sự hiện diện của văn bản/xml.

Chúc may mắn!

Edit:

Opps vào liên kết. linh cảm của tôi là IE luôn thêm / và thiết lập các tiêu đề chấp nhận chỉ cần thêm các loại mime mong muốn sau khi /.

+0

Nó không chỉ thêm /. Nó thực sự bổ sung: \ */\ * Vấn đề định dạng trong câu hỏi –

+0

Vâng, tôi đã tìm ra vấn đề định dạng ... Tôi phải đối mặt với cùng một điều – BStruthers

2

Tôi nghĩ rằng các poster ban đầu có thể đã được đề cập đến liên kết này: http://blogs.msdn.com/ieinternals/archive/2009/07/01/IE-and-the-Accept-Header.aspx Tuy nhiên, điều này không giải thích hành vi mà bạn nhìn thấy.

IE không tự nó có hành vi mà bạn mô tả và đặt tiêu đề Chấp nhận qua XMLHTTPRequest sẽ hoạt động bình thường. Tôi đã thử nghiệm trong IE8 để xác nhận.

Có thể có sự cố trong phiên bản jQuery của bạn, hoặc có thể bạn có một số plugin mangling lưu lượng truy cập của bạn?

8

Sự cố của bạn có vẻ như được mô tả ở đây: http://www.grauw.nl/blog/entry/470. Vấn đề là XMLHttpRequest specification hiện tuyên bố rằng tác nhân người dùng sẽ không đặt bất kỳ tiêu đề Chấp nhận nào theo mặc định cho yêu cầu, để req.setRequestHeader() chỉ có thể nối thêm các Chấp nhận mới. Rất tiếc, các trình duyệt chưa tuân thủ điều này. Sự cố ghi lại vấn đề cho phép bạn kiểm tra trình duyệt của mình để xem trình duyệt có hoạt động bình thường hay không, và tiếc là IE7, Chrome, Safari, Firefox và Opera đều thất bại.

Laurens Grauw cũng nói về những ảnh hưởng của đầu tiên cố gắng để null ra Chấp nhận tiêu đề với

setRequestHeader('Accept', '') 

hoặc

setRequestHeader('Accept', null) 

Đây có thể giúp đây.

Lỗi máy chủ xấu xí: Nếu bạn có quyền kiểm soát ứng dụng phía máy chủ, bạn có thể cố định nó để luôn trả về XML, thêm hỗ trợ cho loại phương tiện tùy chỉnh như "application/i-really-want-xml", hoặc thêm hỗ trợ cho tiêu đề HTTP tùy chỉnh như "X-Accept".

+0

setRequestHeader ('Accept', null) cho "loại không khớp" IE8 Đặt nó thành "" các tác phẩm đầu tiên! – mplungjan

68

Tôi cũng gặp vấn đề với điều này, không chỉ trong IE mà còn trong Chrome và Safari sử dụng jQuery 1.6.2. Giải pháp này dường như hoạt động như dự định trong tất cả các trình duyệt mà tôi đã thử (Chrome, Safari, IE, Firefox).

$.ajax({ 
    headers: { 
     Accept : "text/plain; charset=utf-8", 
     "Content-Type": "text/plain; charset=utf-8" 
    }, 
    data: "data", 
    success : function(response) { 
     ... 
    } 
}) 

Hãy thử nếu điều này vẫn gây khó khăn cho bạn.

24

Sử dụng jQuery 1.5 + bạn có thể thiết lập các tiêu đề chấp nhận mỗi dataType để bạn có thể làm điều gì đó như thế này:

$.ajax({ 
    dataType: ($.browser.msie) ? "text" : "xml", 
    accepts: { 
     xml: "text/xml", 
     text: "text/xml" 
    } 
}); 
+0

Từ nguồn gốc của 1.11.1- '\t \t chấp nhận: { \t \t \t "*": allTypes, \t \t \t văn bản: "text/plain", \t \t \t html: "text/html", \t \t \t xml: "application/xml, text/xml", \t \t \t json: "application/json, text/javascript" \t \t},' – nicodemus13

+0

Vì vậy, đây là những chấp nhận rằng dự kiến ​​một d như trên, bạn cũng phải đặt kiểu dữ liệu. – nicodemus13

1

Mặc dù isnt này như thế nào tài liệu khẳng định nó cần phải được thực hiện, đó là những gì làm việc cho tôi .

jQuery.ajax({ 
    type: "POST", 
    url: "...", 
    data: ..., 
    contentType: "text/xml", 
    beforeSend: function(req) { 
    req.setRequestHeader("Accept", "text/xml"); 
    }, ...}); 
Các vấn đề liên quan