10

My backbone.js приложение, бросающее HTTP OPTIONS, не обнаружило ошибку, когда я пытаюсь сохранить модель в моей успокоительной веб-службе, расположенной на другом хосте/URL-адресе.Ошибка HTTP OPTIONS в Codeigniter от Phil Sturgeon Restserver и Backbone.js

На основе моих исследований, я собрал из этого post, что:

запрос будет постоянно послать заголовок запроса OPTIONS HTTP, а не инициировать запрос POST на всех.

Очевидно, что CORS с запросами, которые будут «вызывать побочные эффекты для пользовательских данных», заставит ваш браузер «предварять» запрос с заголовком запроса OPTIONS, чтобы проверить утверждение, прежде чем фактически отправить ваш предполагаемый метод HTTP-запроса.

я пытался обойти эту проблему:

  • Settting emulateHTTP в Backbone к истине.

Backbone.emulateHTTP = true;

  • Я также Допускаются все CORS и варианты CSRF в заголовке.

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

Приложение разбилось, когда была введена строка кода Backbone.emulateHTTP.

Есть ли способ ответить на запрос OPTIONS в CodeSIgniter RESTServer и есть ли другие альтернативы, позволяющие либо отключить этот запрос из места разговора?


Я нашел this on Github как одно решение. Я не уверен, буду ли я использовать его, поскольку он немного устарел.

ответ

28

Я столкнулся с той же проблемой. Для его решения у меня есть MY_REST_Controller.php в ядре, и все мои контроллеры REST API используют его как базовый класс. Я просто добавил такой конструктор, чтобы обрабатывать запросы 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(); 
} 

Это просто проверяет, является ли тип запроса OPTIONS и если это так просто вымирает, которые возвращают код 200 для запроса.

+0

отлично! благодаря! –

+0

После поиска часов; это было решением.Спасибо :) –

+0

В дополнение к этому мы можем добавить «Access-Control-Allow-Origin», как этот, заголовок («Access-Control-Allow-Origin:». $ _SERVER ['HTTP_ORIGIN']); Так что здесь вы можете проверить, какой доступ к домену принадлежит вашим api. –

6

Вы также можете изменить свойство $allowed_http_methods в своем подклассе, чтобы исключить метод опций. Предыдущие версии REST_controller не сделали ничего с ВАРИАНТАМИ и добавив эту строку, кажется, чтобы имитировать это поведение:

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

решает [запрос POST с ошибкой AngularJS с предполетным кодом статуса OPTION = 404 с помощью CodeIgniter ResetServer] (http://stackoverflow.com/q/23954433/802365) –

+0

Это намного чище, чем более высокий рейтинг. +1 –