10

L'applicazione backbone.js My lancia un OPZIONI HTTP non trovato errore quando provo a salvare un modello sul mio servizio Web riposante che si trova su un altro host/URL.Errore OPZIONI HTTP in Codeigniter Restserver e Backbone.js di Phil Sturgeon

Sulla base della mia ricerca, ho raccolto da questa post che:

una richiesta sarebbe costantemente inviare una richiesta di intestazione OPZIONI http, e non far scattare la richiesta POST a tutti.

Apparentemente il CORS con richieste che "causano effetti collaterali sui dati dell'utente" farà sì che il browser "verifichi" la richiesta con l'intestazione di richiesta OPTIONS per verificare l'approvazione, prima di inviare effettivamente il metodo di richiesta HTTP desiderato.

Ho cercato di aggirare questo ostacolo:

  • settting emulateHTTP in Backbone true.

Backbone.emulateHTTP = true;

  • ho anche permesso ammessi tutti CORS e le opzioni CSRF nell'intestazione.

    intestazione ('Access-Control-Allow-Origin: *');
    intestazione ("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); intestazione ("Access-Control-Allow-Methods: GET, POST, OPTIONS");

L'applicazione si arrestava in modo anomalo quando veniva introdotta la riga di codice Backbone.emulateHTTP.

C'è un modo per rispondere alla richiesta OPZIONI in CodeIgniter RESTServer e ci sono altre alternative per consentire o disabilitare questa richiesta dal luogo di conversazione?


Ho trovato this on Github come una soluzione. Non sono sicuro se dovrei usarlo come sembra un po 'obsoleto.

risposta

28

Ho riscontrato esattamente lo stesso problema. Per risolverlo ho un MY_REST_Controller.php in core e tutti i miei controller API REST lo usano come classe base. Ho semplicemente aggiunto un costruttore come questo per gestire le richieste OPTIONS.

function __construct() { 

    header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method"); 
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); 
    $method = $_SERVER['REQUEST_METHOD']; 
    if($method == "OPTIONS") { 
     die(); 
    } 
    parent::__construct(); 
} 

Questo solo controlla se il tipo di richiesta è OPTIONS e se così muore appena fuori che restituiscono un codice 200 per la richiesta.

+0

perfetto! Grazie! –

+0

Dopo aver cercato per ore; questa era la soluzione.Grazie :) –

+0

Sopra di esso possiamo aggiungere "Access-Control-Allow-Origin" come questo, header ('Access-Control-Allow-Origin:'. $ _SERVER ['HTTP_ORIGIN']); In questo modo è possibile controllare consentire quale dominio accede alle proprie API. –

6

È inoltre possibile modificare la proprietà $allowed_http_methods nella sottoclasse per escludere il metodo di opzioni. Le versioni precedenti di REST_controller non ha fatto nulla con OPZIONI e l'aggiunta di questa linea sembra imitare quel comportamento:

protected $allowed_http_methods = array('get', 'delete', 'post', 'put'); 
+0

risolve [richiesta POST con AngularJS non riesce con preflight codice stato OPTION = 404 con CodeIgniter ResetServer] (http://stackoverflow.com/q/23954433/802365) –

+0

Questo è molto più pulito che la risposta più alta classifica. +1 –