2016-06-06 16 views
6

Tôi đã thử cả những điều riêng:XMLHttpRequest/ajax thiết Content-Type

lưu ý: url là một biến chứa một url https và jsonString chứa một chuỗi json hợp lệ

var request = new XMLHttpRequest(); 
try{ 
    request.open("POST", url); 
    request.setRequestHeader('Accept', 'application/json'); 
    request.send(jsonString); 
} catch(e) { 
    alert(e); 
} 

var options = { 
    type: "POST", 
    url: url, 
    dataType: "json", 
    data: jsonString, 
    accept: "application/json" 
}; 

$.ajax(options) 

Sự cố là hệ thống chúng tôi đang đăng để yêu cầu Tiêu đề loại nội dung có giá trị "application/json".

Với cách thức hiện tại, phương pháp được sử dụng là POST, tiêu đề Chấp nhận là "application/json" và Content-Type mặc định là "application/x-www-form-urlencoded; charset = UTF- 8 "

Trong ví dụ đầu tiên, nếu request.setRequestHeader ('Content-Type', 'application/json'); được thêm 1 dòng ở trên hoặc dưới tiêu đề Chấp nhận, phương thức đã sử dụng thay đổi thành OPTIONS, tiêu đề Chấp nhận thay đổi thành "văn bản/html, ứng dụng/xhtml + xml, ứng dụng/xml; q = 0.9, /; q = 0.8" và tiêu đề Loại Nội dung biến mất như thể nó không được nhìn thấy.

Trong ví dụ thứ hai, nếu contentType: "application/json" được thêm vào bất kỳ đâu trong các tùy chọn, điều tương tự cũng xảy ra trong ví dụ đầu tiên.

Cách thích hợp để đặt tiêu đề Kiểu nội dung trong ajax hoặc XMLHttpRequest là gì?

Chỉnh sửa: Tôi nên thêm điều đó bằng cách sử dụng plugin khách hàng phần còn lại firefox, chuỗi json, url và chấp nhận và tiêu đề loại nội dung đều hoạt động tốt. Chúng tôi dường như không thể có được tiêu đề nội dung được đặt trên trang của chính chúng tôi.

+0

Bạn có ví dụ về jsfiddle? Không bao giờ sử dụng đối tượng XMLHttpRequest trước đây nhưng thiết lập cài đặt contentType thành "application/json" sẽ hoạt động cho jquery. Tôi cũng không nghĩ rằng có một thiết lập "chấp nhận". Ngoài ra, yêu cầu preflight OPTIONS xảy ra khi thực hiện cuộc gọi tên miền chéo. Đó là những gì bạn đang làm? – georaldc

+0

Ý tôi là, preflight OPTIONS xảy ra khi thực hiện cuộc gọi tên miền chéo với giá trị loại nội dung khác với giá trị mặc định "application/x-www-form-urlencoded; charset = UTF-8" với JQuery.ajax() – georaldc

Trả lời

6

Trong ví dụ đầu tiên, nếu request.setRequestHeader ('Content-Type', 'application/json'); được thêm 1 dòng ở trên hoặc dưới tiêu đề Chấp nhận, phương pháp đã sử dụng thay đổi cho OPTIONS

Điều này là do bạn đang thực hiện a cross origin request từ JS được nhúng trong trang web. Thay đổi các kích hoạt content-type (với cái mà bạn không thể thực hiện bằng biểu mẫu HTML đơn giản) a preflight request yêu cầu sự cho phép từ máy chủ để thực hiện yêu cầu thực tế.

Bạn cần thiết lập máy chủ để phản hồi với các tiêu đề CORS thích hợp để cấp quyền.

HTTP/1.1 200 OK 
Date: Mon, 01 Dec 2008 01:15:39 GMT 
Access-Control-Allow-Origin: http://your.site.example.com 
Access-Control-Allow-Methods: POST, GET, OPTIONS 
Access-Control-Allow-Headers: Content-Type 

Sau đó, trình duyệt sẽ thực hiện yêu cầu POST mà bạn yêu cầu.

+0

lý do không phải plugin firefox khách hàng còn lại sẽ kích hoạt yêu cầu xuất xứ chéo không? hoặc nếu có, tại sao nó có thể đi qua mà không có một vấn đề? – backcab

+2

@backcab - Bởi vì nó được cài đặt phần mềm và không phải là một chút JavaScript từ một trang web không đáng tin cậy. – Quentin

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