Angular 身份验证错误:飞行前的响应具有无效的HTTP状态代码405

Angular 身份验证错误:飞行前的响应具有无效的HTTP状态代码405,angular,Angular,我想实现身份验证。事实上,我的项目是在Angular 2 Beta版中构建的,但我使用认证示例进行测试。我有自己的API,并且刚刚将它的url添加到这个示例项目中。它不工作)它显示此错误: Failed to load resource: the server responded with a status of 405 (Method Not Allowed) Fetch API cannot load http://blah-blah-blah. Response for preflight

我想实现身份验证。事实上,我的项目是在Angular 2 Beta版中构建的,但我使用认证示例进行测试。我有自己的API,并且刚刚将它的url添加到这个示例项目中。它不工作)它显示此错误:

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)
Fetch API cannot load http://blah-blah-blah. Response for preflight has invalid HTTP status code 405
以下是登录方法:

login(event, phone, password) {
event.preventDefault();
window.fetch('http://blah-blah-blah', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    phone, password
  })
})
.then(status)
.then(json)
.then((response:any) => {
  localStorage.setItem('access_token', response.id_token);
  this.router.parent.navigateByUrl('/home');
})
.catch((error) => {
  alert(error.message);
  console.log(error.message);
});
}

看起来您正在尝试进行跨域AJAX调用。要使其工作,您的远程服务器API必须支持。飞行前请求是浏览器在发出实际飞行后请求之前使用选项动词发送的特殊请求:

OPTIONS http://blah-blah-blah
服务器必须以正常的200状态代码响应,并包含正确的CORS头,指示允许哪些域向其发出请求。只有在这之后,才会发送实际的POST请求


您的API存在的问题是,端点将405不允许的状态代码返回到此
OPTIONS
请求。因此,您需要修复API,使其支持
选项
动词。

看起来您正在尝试进行跨域AJAX调用。要使其工作,您的远程服务器API必须支持。飞行前请求是浏览器在发出实际飞行后请求之前使用选项动词发送的特殊请求:

OPTIONS http://blah-blah-blah
服务器必须以正常的200状态代码响应,并包含正确的CORS头,指示允许哪些域向其发出请求。只有在这之后,才会发送实际的POST请求


您的API存在的问题是,端点将405不允许的状态代码返回到此
OPTIONS
请求。因此,您需要修复API,使其支持
选项
动词。

我想您没有领会我回答的要点。问题不在角度应用程序中。您正试图调用的是服务器端API。这就是您应该解决问题并启用CORS的地方,因此基本上您应该为
http://api.paydacard.kz/identity/login
endpoint。在你的问题中,你提到这是你自己的API,所以更新它应该不会有问题。我知道了),但我无法配置API,我无法访问它。哦,那你就有问题了。如果您无法更改此API的代码,则需要设置另一个API,该API与angular应用程序托管在同一域中,并充当域与远程域之间的桥梁。因此,基本上,您将从angular应用程序向本地API发送AJAX请求,如
/myapi
,它将负责通过向远程API发出服务器端请求来委派调用。您显示的代码是angular和javascript。无论您在客户端上做什么,都无法绕过浏览器内置的同源策略限制,该限制禁止您进行跨域AJAX调用。为了更好地理解CORS的工作原理以及如何在服务器上启用它,我真的建议您阅读一点关于CORS的内容。这里有一篇文章可以很好地概述一下:我认为您没有领会我回答的要点。问题不在角度应用程序中。您正试图调用的是服务器端API。这就是您应该解决问题并启用CORS的地方,因此基本上您应该为
http://api.paydacard.kz/identity/login
endpoint。在你的问题中,你提到这是你自己的API,所以更新它应该不会有问题。我知道了),但我无法配置API,我无法访问它。哦,那你就有问题了。如果您无法更改此API的代码,则需要设置另一个API,该API与angular应用程序托管在同一域中,并充当域与远程域之间的桥梁。因此,基本上,您将从angular应用程序向本地API发送AJAX请求,如
/myapi
,它将负责通过向远程API发出服务器端请求来委派调用。您显示的代码是angular和javascript。无论您在客户端上做什么,都无法绕过浏览器内置的同源策略限制,该限制禁止您进行跨域AJAX调用。为了更好地理解CORS的工作原理以及如何在服务器上启用它,我真的建议您阅读一点关于CORS的内容。下面是一篇文章,它提供了一个很好的概述: