2012-11-29 34 views
5

Tôi đang cố gắng tích hợp Backbone trong Yii và do đó tôi cần REST. Vì vậy, tôi đã cài đặt tiện ích mở rộng Yii, restfullyii, sử dụng tên người dùng và mật khẩu cần được chuyển cho các yêu cầu. Vấn đề là tôi không có ý tưởng làm thế nào để làm điều này với Backbone.Chuyển tiêu đề HTTP tùy chỉnh cho các yêu cầu RESTful

Ví dụ về yêu cầu truy nã:

List 
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: [email protected]" -H "X_REST_PASSWORD: [email protected]" http://yii-tester.local/api/sample/  
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: [email protected]" -H "X_REST_PASSWORD: [email protected]" http://yii-tester.local/api/sample/limit/1 
curl -i -H "Accept: application/json" -H "X_REST_USERNAME: [email protected]" -H "X_REST_PASSWORD: [email protected]" http://yii-tester.local/api/sample/limit/10/5 (limit/offeset) 

phản ứng lỗi hiện tại, mà hoàn toàn có ý nghĩa ..:

{ 
    "success": false, 
    "message": "You are not authorized to proform this action.", 
    "data": {"errorCode":500} 
} 

Có ai có một đầu mối làm thế nào để gửi các giá trị đó trong suốt Backbone?

Trả lời

2

Xương sống ủy quyền các yêu cầu XHR của nó cho jQuery/Zepto, đó là những gì bạn sẽ phải sửa đổi.

Giải pháp đơn giản nhất có lẽ là để cung cấp tùy chọn mặc định qua $.ajaxSetup và các tiêu đề headers options

(thêm 1.5)
Mặc định: {}

Bản đồ thêm tiêu đề cặp khóa/giá trị để gửi cùng với yêu cầu . Cài đặt này được đặt trước khi chức năng beforeSend được gọi; do đó, mọi giá trị trong cài đặt tiêu đề có thể được ghi đè từ trong hàm beforeSend.

Bạn sẽ thiết lập nó như thế này:

$.ajaxSetup({ 
    headers:{ 
     X_REST_USERNAME: "[email protected]", 
     X_REST_PASSWORD: "[email protected]" 
    } 
}); 

Mỗi yêu cầu gửi sẽ có tiêu đề tùy chỉnh. Xem http://jsfiddle.net/nikoshr/j5Rr4/

Hoặc bạn có thể vượt qua tùy chọn bổ sung cho mỗi yêu cầu, Backbone sẽ chuyển đến jQuery:

var m = new Backbone.Model(); 
m.fetch({ 
    headers:{ 
     X_REST_USERNAME: "[email protected]", 
     X_REST_PASSWORD: "[email protected]" 
    } 
}); 

http://jsfiddle.net/nikoshr/j5Rr4/2/

Cuối cùng, bạn có thể ghi đè lên Backbone.sync để thêm tiêu đề cho mọi yêu cầu :

Backbone.realsync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    options || (options = {}); 
    options.headers = { 
     X_REST_USERNAME: "[email protected]", 
     X_REST_PASSWORD: "[email protected]" 
    }; 

    return Backbone.realsync.call(model, method, model, options); 
}; 

var m = new Backbone.Model(); 
m.fetch(); 

http://jsfiddle.net/nikoshr/j5Rr4/4/

+0

Tùy chọn đầu tiên không hoạt động mà không có tiêu đề nào được thêm vào, nhưng đó là một nỗ lực tuyệt vời. Tùy chọn thứ hai không áp dụng cho tôi, bởi vì tôi đang tìm nạp một bộ sưu tập và không lưu mô hình. Bạn có gợi ý cho điều đó không? –

+0

@SjaakRusma Được sửa đổi với tìm nạp, nhưng điều đó thực hiện chính xác điều tương tự với $ .ajaxSetup: thêm tiêu đề tùy chỉnh vào yêu cầu. Kiểm tra các câu đố với bảng điều khiển và bạn sẽ thấy các tiêu đề bổ sung đó. – nikoshr

+0

Ajaxoptions không hoạt động, thêm tùy chọn được chỉnh sửa thứ hai vào m.fetch ({..}); trong đó m là Bộ sưu tập, ĐÃ LÀM VIỆC! Cảm ơn! –

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