Ошибка REST API. Предварительная проверка канала CORS не удалась.

Я создал RESTapi для вставки данных в мою базу данных. Он отлично работает с расширением POSTMAN, но я получаю сообщение об ошибке в методе angularjs http post.

Мой код Restapi создан в фреймворке yii2. Мой код ниже,

public function actionNew()
 {

  $model = new Apieducation();

  $user_id = $_REQUEST['user_id'];

  $education = $_REQUEST['education'];

  $passing_year = $_REQUEST['passing_year'];

  $institute = $_REQUEST['institute'];


  //$model->attributes=$params;
  $model->user_id = $user_id;
  $model->education = $education;
  $model->passing_year = $passing_year;
  $model->institute = $institute;


  if ($model->save()) {

     header('Access-Control-Allow-Origin: *');
     header('Access-Control-Allow-Methods: GET, POST');
     header("Access-Control-Allow-Headers: X-Requested-With,content-type");
         echo json_encode(array('status'=>'1','data'=>$model->attributes),JSON_PRETTY_PRINT);
           \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  } 
  else
  {

 $jobs[] = 'failed';
     header('Access-Control-Allow-Origin: *');
     header('Access-Control-Allow-Methods: GET, POST');
     header("Access-Control-Allow-Headers: X-Requested-With,content-type");
     echo json_encode(array('status'=>'1','data'=>array_filter($jobs)),JSON_PRETTY_PRINT);
     \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

  }

}

И мой код функции Angularjs:

$scope.educationcreate = function() {

     var data = $.param({
            user_id: $scope.data.user_id,
            education: $scope.data.education,
            passing_year: $scope.data.passing_year,
            institute: $scope.data.institute
        });

        var config = {
            headers : {
                'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
            }
        };

        $http.post('http://localhost/basic/web/index.php?r=apieducation/new', data, config)
          .success(function(data, status, headers, config) {

            alert('Successfully');
        })
         .error(function(data, status, headers, config) {
            alert("ERROR");
        });

      };

Я получил консольную ошибку,

Запросы между источниками заблокированы: та же политика происхождения запрещает чтение удаленного ресурса по адресу http://localhost/basic/web/index.php?r=apieducation/new. (Причина: предварительная проверка канала CORS не удалась).

Как я могу это решить?


person Prakash Baskaran    schedule 05.07.2016    source источник
comment
какой контроллер вы расширяете (ActiveController или Rest/Controller)? и как настроены ваши UrlRules? Вы можете добавить их к вопросу?   -  person Salem Ouerdani    schedule 05.07.2016
comment
также 8 строк кода, следующих за new Apieducation(), можно просто заменить одной: $model->load(Yii::$app->request->bodyParams, '').   -  person Salem Ouerdani    schedule 05.07.2016
comment
В Yii уже есть встроенные действия и фильтры для того, что вы создаете. Я предлагаю сначала проверить его документацию. в противном случае, если вы хотите перестроить то, что делает фреймворк, вам нужно будет создать эквивалент также и это действие для ответа на предварительные запросы.   -  person Salem Ouerdani    schedule 05.07.2016
comment
класс ApieducationController расширяет \yii\rest\ActiveController   -  person Prakash Baskaran    schedule 05.07.2016
comment
я не добавлял правила URL   -  person Prakash Baskaran    schedule 05.07.2016


Ответы (2)


Используя фильтр Cors для устранения этой ошибки,

public function behaviors()
{
    return [
        'corsFilter' => [
            'class' => Cors::className(),
            'cors' => [
                // restrict access to
                'Origin' => ['*'],
                'Access-Control-Request-Method' => ['POST', 'GET'],
                // Allow only POST and PUT methods
                'Access-Control-Request-Headers' => [' X-Requested-With'],
                // Allow only headers 'X-Wsse'
                'Access-Control-Allow-Credentials' => true,
                // Allow OPTIONS caching
                'Access-Control-Max-Age' => 3600,
                // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
            ],
        ],
    ];
}
person Prakash Baskaran    schedule 09.09.2016
comment
Спасибо. Это было действительно полезно. - person Aneeez; 31.10.2019

My short solution:

  • On server side:

    npm install cors
    

    добавить app.use(cors({origin: '*'})); перед всеми определениями маршрута

  • On client side: do everything normally

    $http.get('http://localhost:36912/api/permissions').then(function (response) {
       console.log(response);
    })
    .catch(function (error) {
       console.error('Status code: ' + error.status);
       console.error('Error message: ' + error.data);
    });
    
    person BjeMTj    schedule 13.12.2016