2012-08-02 21 views
5

Sto provando a eseguire la mia prima app RESTful con Backbone e Yii Framework. Non ho avuto problemi con i metodi GET ma sono bloccato con il metodo POST, per creare un nuovo elemento.

Ho un modello Commento in Backbone:

var commentModel = Backbone.Model.extend({ 

    urlRoot: "index.php/api/comments", 
    idAttribute: 'id', 

    defaults: { 
     content: "Empty comment", 
     status: 1 
    } 
}); 

A mio avviso ho aggiungere una funzione per creare un nuovo commento passando i valori dal relativo modulo:

on_submit: function(e) { 
      var new_comment = new Comment({author_id: this.$('#author_text').val(), content: this.$('#content_text').val(), post_id: this.$("#post_text").val(), status: this.$("#status_text").val()}); 

     new_comment.save(); 
     }, 

Guardando la richiesta con Firebug sembra tutto a posto, nella scheda POST posso vedere tutti i valori:

JSON    
author_id "7" 
content "Epic fail" 
post_id "7" 
status "2" 

Source 
{"content":"Epic fail","status":"2","author_id":"7","post_id":"7"} 

Ma nel mio php Api la variabile $ _POST è vuota!

foreach($_POST as $var=>$value) { 

    if($model->hasAttribute($var)) 
     $model->$var = $value; 
    else 
     $this->_sendResponse(500); 
} 

Qualcuno ha qualche idea? Leggendo la documentazione di Backbone.Sync, capisco che dovrebbe usare il POST per creare una richiesta.

ho trovato una soluzione ottenere i valori da:

file_get_contents('php://input') 

ma id non si sente bene a me ...

Grazie.

+1

Qualcosa del genere http://stackoverflow.com/questions/10930789/insert-backbone-js-m odel-in-mysql-database/10931092 # 10931092? – nikoshr

+0

Il valore '$ _SERVER ['REQUEST_METHOD']' è "POST", quindi i valori dovrebbero essere all'interno dell'array $ _POST, ho ragione? – Ingro

+0

No, il metodo è un POST, ma i dati vengono inviati al corpo HTTP. Non viene inviato come forma regolare con i parametri impostati e un application/x-www-form-urlencoded come tipo mime. Controlla cosa viene inviato in questo Fiddle http://jsfiddle.net/RK7LN/ – nikoshr

risposta

10

Da Backbone.sync documentation,

Con l'implementazione di default, quando Backbone.sync invia una richiesta di per salvare un modello, saranno passati i suoi attributi, serializzato come JSON, e inviato nel corpo HTTP con tipo di contenuto application/json.

che significa che non si riceveranno i dati in parametri come in un normale modulo di posta ma nel corpo della risposta HTTP.

Hai tre opzioni per affrontare questo comportamento:

  1. Modificare il codice del server per capire le richieste REST, consultare Insert Backbone.js model into MySQL database ad esempio
  2. Vedi se Backbone.emulateJSON potesse rispondere alle vostre esigenze
  3. sovrascrittura Backbone.sync e invia i dati per adattarsi meglio al tuo server
+0

Beh, sembra che abbia fatto un'ipotesi errata. Grazie per i chiarimenti, ora farò qualche test e vedrò quale soluzione si adatta meglio alla mia app. – Ingro

Problemi correlati