2011-12-16 40 views
7

Tôi đang truy vấn một dịch vụ web REST sử dụng tiêu đề http tùy chỉnh để xác thực.

Nếu tôi thực hiện POST mà không có tiêu đề, tôi nhận được lỗi dự kiến, nhưng khi tôi thêm tiêu đề, tôi nhận được lỗi 404 thay vì những gì tôi thực sự cần.

Đây là mã của tôi

$.ajax({ 
    type: 'POST', 
    url: 'http://server.com/service', 
    beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') }, 
    success: function(data) {  
    alert('success.'); 
    } 
}); 

Đây là firebug tiêu đề ra:

OPTIONS/dịch vụ HTTP/1.1 Host: server.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 8.0.1) Gecko/20100101 Firefox/8.0.1 Chấp nhận: văn bản/html, ứng dụng/xhtml + xml, ứng dụng/xml; q = 0,9, /; q = 0,8 Accept-Language: en-us, en; q = 0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Kết nối: giữ -alive xuất xứ: null Access-Control-Yêu cầu-Phương pháp: POST Access-Control-Yêu cầu-Headers: tùy chỉnh-header-key pragma: no-cache Cache-Control: no-cache

và tiêu đề smae khi thực hiện bài đăng có áp phích, trả về kết quả mong muốn.

POST/dịch vụ HTTP/1.1 Host: server.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 8.0.1) Gecko/20.100.101 Firefox/8.0.1 Chấp nhận: text/html, application/xhtml + xml, application/xml; q = 0.9, /; q = 0.8 Accept-Language: en-us, en; q = 0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Kết nối: giữ sống TÙY CHỌN-HEADER-KEY: CUSTOM-HEADER-VALUE pragma: no-cache Cache-Control: no-cache Content-Length: 0

Sự khác biệt là khá rõ ràng, nhưng tôi không biết những gì tôi đang làm sai trong đoạn code jquery.

Có ai giúp tôi không?

+1

bạn đang gửi tin nhắn này yêu cầu 'POST' trên máy chủ? – Blender

+0

Máy xay sinh tố đang đi đúng hướng. Điều này rất có thể là do vi phạm sandbox. Truy cập dịch vụ VIA jsonp hoặc sử dụng máy chủ của bạn làm proxy cho dịch vụ. – John

+0

"và tiêu đề smae khi thực hiện bài đăng có áp phích" .. "POSTER" là gì? – humblelistener

Trả lời

1

này có thể hoặc không thể giúp đỡ, nhưng tôi nghĩ rằng bạn có thể thêm các tiêu đề trong các tùy chọn dữ liệu:

$.ajax({ 
    type: 'POST', 
    data: put the results of your header request here, 
    url: 'http://server.com/service', 
    beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') }, 
    success: function(data) {  
    alert('success.'); 
    } 
}); 
2

Đây là yêu cầu tên miền chéo. Vì vậy, bạn không thể giải quyết nó từ phía trình duyệt. Bạn có thể cần một Proxy phía máy chủ để thực hiện POST tới một miền khác.

1

Bất kỳ tiêu đề tùy chỉnh nào trên các cuộc gọi tên miền chéo kích hoạt yêu cầu trước chuyến bay là cuộc gọi OPTIONS. Bạn cần phải bỏ qua kiểm tra bảo mật cho OPTIONS cuộc gọi hoặc xử lý yêu cầu riêng biệt vì tiêu đề tùy chỉnh không được chuyển với yêu cầu OPTIONS. Ngoài ra không có hại trong việc cho phép yêu cầu trước chuyến bay vì không có dữ liệu thực tế nào được truyền lại cho trình duyệt bằng cuộc gọi đó.Về cơ bản trình duyệt yêu cầu máy chủ nếu nó được phép thực hiện cuộc gọi đó trước khi thực sự thực hiện nó. Bạn cũng có thể cần kiểm tra các tiêu đề Access-Control của mình. Tất cả những thay đổi này là ở phía máy chủ btw, do đó bạn cần phải có toàn quyền kiểm soát webservice.

+0

Ngay cả khi hiểu rằng việc gửi tiêu đề khách hàng trên OPTIONS không có ý nghĩa gì từ góc độ CORS ... Bạn có biết liệu có cần phải hack hoặc giải pháp để thêm tiêu đề khách hàng vào yêu cầu OPTIONS không? – juancancela

+0

Tôi đã nói các tiêu đề tùy chỉnh của bạn KHÔNG được gửi cùng với yêu cầu OPTIONS. Về cơ bản nó là một yêu cầu đơn giản hỏi xem nó có được phép POST, PUT vv trên đường dẫn này hay không. Và không, không có cách giải quyết nào để thêm bất kỳ tiêu đề tùy chỉnh nào vào OPTIONS cuộc gọi, trình duyệt không cho phép điều này làm biện pháp bảo mật. Bạn luôn có thể sử dụng JSONP để đi quanh các giới hạn CORS nhưng bạn sẽ phải sử dụng các tham số truy vấn để chuyển bất kỳ dữ liệu nào đến máy chủ vì nó chỉ là một < script > GET –

5

Trong một yêu cầu miền chéo nếu tiêu đề không được phép bởi trình duyệt dịch vụ sẽ chỉ xóa nó

Tại trình duyệt trình duyệt đầu tiên sẽ thực hiện cuộc gọi OPTION để kiểm tra sự cho phép (Xuất xứ, Headers, phương pháp)

trong cấu hình dịch vụ của bạn, bạn phải cho phép các tiêu đề để có thể gửi nó đến máy chủ sử dụng

Access-Control-Allow-Headers: YOUR_HEADER_NAME 
Các vấn đề liên quan