2012-11-29 12 views
5

Ich versuche Backbone in Yii zu integrieren und daher brauche ich REST. Also habe ich eine Yii-Erweiterung installiert, restfullyii, die einen Benutzernamen und ein Passwort verwendet, die Anforderungen übergeben werden müssen. Das Problem ist, dass ich keine Ahnung habe, wie man das mit Backbone macht.Pass benutzerdefinierte HTTP-Header zu RESTful Anfragen

Beispiel gesuchter Anfrage:

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) 

Aktueller Fehlerreaktion, was Sinn macht total ..:

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

Hat jemand eine Ahnung, wie diese Werte im gesamten Backbone schicken?

Antwort

2

Backbon delegiert seine XHR-Anforderungen an jQuery/Zepto, das müssen Sie ändern.

Die einfachste Lösung ist wahrscheinlich Ausfälle Optionen über $.ajaxSetup und der headers options

Header (hinzugefügt 1.5)
Standard zur Verfügung zu stellen: {}

Eine Karte von zusätzlichen Header Schlüssel/Wert-Paare zusammen mit der Anfrage senden. Diese Einstellung wird vor dem Aufruf der beforeSend-Funktion festgelegt. daher können alle Werte in der Kopfzeileneinstellung von innerhalb der BeforeSend-Funktion überschrieben werden.

Sie würde es so gesetzt:

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

jeder Anfrage die benutzerdefinierte Header wird gesendet. Siehe http://jsfiddle.net/nikoshr/j5Rr4/

Oder Sie könnten zusätzliche Optionen übergeben zu jeder Anfragen, Backbone wird sie in jQuery weiter:

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

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

Schließlich könnten Sie Backbone.sync überschreiben die Header für jede Anfrage hinzufügen :

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

Die erste Option funktioniert nicht, keine Header werden hinzugefügt, aber es war eine schöne Anstrengung. Die zweite Option ist für mich nicht anwendbar, da ich eine Sammlung abrufe und kein Modell speichere. Haben Sie auch einen Vorschlag dafür? –

+0

@SjaakRusma Geändert mit einem Abruf, aber das macht genau das gleiche wie $ .ajaxSetup: Fügen Sie der Anforderung benutzerdefinierte Header hinzu. Inspiziere die Geigen mit einer Konsole und du solltest diese zusätzlichen Header sehen. – nikoshr

+0

Ajaxoptions funktionierte nicht und fügte die zweite editierte Option zu m.fetch ({..}) hinzu; wo m ist die Sammlung, WORKED! Vielen Dank! –

Verwandte Themen