Как вызвать API отдыха Yii2 в Angular 7 - PullRequest
2 голосов
/ 14 мая 2019

У меня есть служба Angular, которая выполняет вызов API. Вот мой subscribe.service.ts файл

    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http'

    @Injectable({
      providedIn: 'root'
    })
    export class SubscribeService {
      readonly postURL = "http://localhost/sampleproject/frontend/web/api/subscribe";
      constructor(private http:HttpClient) { }

      subscribeSubmit(subscriber){
       return this.http.post(this.postURL, subscriber);
      }
    }

PostURL, который называется API, находится в yii2. Ниже мой ApiController.php файл

            <?php
        namespace frontend\controllers;
        use Yii;
        use yii\web\Controller;

        class ApiController extends Controller {
            public $enableCsrfValidation = false;
            public static function allowedDomains() {
            return [
                 '*',                       
            ];
        }

            public function behaviors() {
            return array_merge(parent::behaviors(), [
                'corsFilter'  => [
                    'class' => \yii\filters\Cors::className(),
                    'cors'  => [
                        'Origin'                           => static::allowedDomains(),
                        'Access-Control-Request-Method'    => ['POST'],
                        'Access-Control-Allow-Credentials' => true,
                        'Access-Control-Max-Age'           => 3600,       
                    ],
                ],

            ]);
        }

             public function beforeAction($action) {
                if (\Yii::$app->getUser()->isGuest &&
                    \Yii::$app->getRequest()->url !== \yii\helpers\Url::to(\Yii::$app->getUser()->loginUrl) && Yii::$app->controller->action->id != 'subscribeforangular') {
                    \Yii::$app->getResponse()->redirect(Yii::$app->request->BaseUrl . '/../../login');
                }
                else {
                    return parent::beforeAction($action);
                }
            }

            public function actionSubscribe(){
                print_r($_POST);
            }

        }

Я пытаюсь отправить данные из angular с помощью http.post в действие "subscribe", которое находится в yii2, но я получаю приведенную ниже ошибку

 Access to XMLHttpRequest at 'http://localhost/sampleproject/frontend/web/api/subscribe' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Следующие строки не добавляются, когда я проверил «Сеть» в консоли, которая говорит, что CORS не реализован с тем, что я написал в контроллере. Согласно моим исследованиям и разработкам следующие строки должны быть добавлены в "http://localhost/sampleproject/frontend/web/api/subscribe"

    HTTP/1.1 200 OK
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Origin: https://my-site.example.com
    Content-Type: application/json; charset=UTF-8
    Date: Fri, 24 Feb 2017 09:21:47 GMT
    Server: Apache
    Content-Length: 27
    Connection: keep-alive

Я нашел решение в Google и внедрил его, но все равно получаю одинаковую ошибку во всех случаях.

Пожалуйста, помогите !! Я пытаюсь это с 2 дней. Я не могу найти правильное решение и, следовательно, размещен здесь.

1 Ответ

0 голосов
/ 14 мая 2019

Похоже, вы запускаете свой угловой проект в другом порту от вас yii2. Вам необходимо настроить CORS для вашего сервера yii2

Что-то вроде

/**
 * List of allowed domains.
 * Note: Restriction works only for AJAX (using CORS, is not secure).
 *
 * @return array List of domains, that can access to this API
 */
public static function allowedDomains()
{
    return [
        // '*',                        // star allows all domains
        'http://test1.example.com',
        'http://test2.example.com',
    ];
}

/**
 * @inheritdoc
 */
public function behaviors()
{
    return array_merge(parent::behaviors(), [

        // For cross-domain AJAX request
        'corsFilter'  => [
            'class' => \yii\filters\Cors::className(),
            'cors'  => [
                // restrict access to domains:
                'Origin'                           => static::allowedDomains(),
                'Access-Control-Request-Method'    => ['POST','GET'],
                'Access-Control-Allow-Credentials' => true,
                'Access-Control-Max-Age'           => 3600,                 // Cache (seconds)
            ],
        ],

    ]);
}

Ссылка ссылка

...