我正在尝试与已经使用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实施中:
如上所述,我已经尝试在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的应用程序。
有什么建议吗?
答案 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呼叫。
同样,我发布了有关此呼叫以及如何找到解决方案的一些参考:
我希望它能对某人有所帮助。