CORS将来自cakephp restapi实现的数据加载到Angular应用中的问题

时间:2019-04-12 13:17:26

标签: php angular rest cors

我正在尝试与已经使用PHP开发的RestAPI服务器(CakePHP框架)进行通讯;我正在尝试在Angular 7应用程序中执行简单的登录操作,如果成功,我将继续实施。

这是Angular App的调用代码:

  constructor(protected cli: HttpClient) { 
    this.tablet_couple = new TabletCoupleModule();
  }

  ngOnInit() {
    this.cli.get('http://work.local/grai/api-angular/api/v1/tablet_couples/1.json')
    .subscribe(
      data => { console.log(data) }
    )
    this.cli.post('http://work.local/grai/api-angular/api/v1/tablet_couples/login.json',{
      username: 'xxxxxxxx',
      passoword:  '123456789',
    })
    .subscribe(
      data => { console.log(data) }
    )
  }

实际的问题是GET调用可以正常工作,但是POST调用仍然无法正常工作。

我确定REST API可以正常工作,因为如果我使用Insomnia之类的工具,则两次调用的响应都是正确的。

我试图找出原因,但是问题出在每次CORS实施中:

enter image description here

如上所述,我已经尝试在Cakephp中强制使用标头,但仍然无法正常工作。

    public function beforeFilter(\Cake\Event\Event $event)
    {
        parent::beforeFilter($event);
        if($this->request->is('OPTIONS')) {
            $this->response->header('Access-Control-Allow-Origin','*');
            $this->response->header('Access-Control-Allow-Methods','*');
            $this->response->header('Access-Control-Allow-Headers','Content-Type, Authorization');
        }
        else {
            $this->response = $this->response->withHeader("Access-Control-Allow-Origin","*");
            $this->response = $this->response->withHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept");
            $this->response = $this->response->withHeader("Access-Control-Allow-Methods","*");
        }
    }

更新1

我找到了一个将CORS与cakephp集成的库:cakephp-cors

这有帮助,但我仍然有一个问题:如果它们不在同一域中(我可以使用CORS),但是我需要使用Rest API。

如果我部署了该应用程序并将Angular App放在可以正常工作的同一个域中;但是我要部署可以访问远程REST API的应用程序。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,我有一个@JensV的“解决方案”坦克。

第一个:: cakephp 3.1.x太旧了

我正在使用CakePHP的旧版本(3.1.14); 3.1.x太旧了,无法正确管理OPTIONS方法调用。

使用CakePHP 3.7。*和插件cakephp-cors可以正常工作,现在我可以从localhost:4200进行远程调用了。

第二个::方法选项

这是一种让我非常痛苦的方法。浏览器会在POST方法调用之前调用此方法。

此方法的正确响应是来自服务器的HTTP代码200。

如果您无法正确管理此呼叫,浏览器将截断POST呼叫。

同样,我发布了有关此呼叫以及如何找到解决方案的一些参考:

我希望它能对某人有所帮助。