这是整合问题。非常感谢您的帮助(提示||指南)
我在本地安装了Angular2和Magento2(bitnami)。对于CROS,Magento conf被更改为具有正确的标题(见下文)。 我从Angular2调用Magento2获取令牌,我遇到了以下问题:
选项http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token 400(错误请求) XMLHttpRequest无法加载http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token。预检的响应具有无效的HTTP状态代码400
Angular 2方:
let headers = new Headers({'Content-type': 'application/json'});
headers.append('Access-Control-Allow-Origin', '*');
headers.append('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,PUT,DELETE');
headers.append('Access-Control-Allow-Headers', 'Origin,Authorization,X-Auth-Token,Accept,Content-Type');
headers.append('Access-Control-Allow-Credentials', 'true');
let options = new RequestOptions({ headers: headers });
return this.http.post( 'http://192.168.56.1:82/magento/index.php/rest/V1/integration/admin/token',
JSON.stringify('{"username":"angUser", "password":"angUser2017"}'),
options)
.map(res => res.json());
Magento2 API用户 angUser / angUser2017 消费者密钥:5bhvi7gjvyafcp35rajuxh0y4me2plga 消费者秘密:yh1nefyw1u80rd0ip1q6f8pijv9x72f1 访问令牌:g5plfwth2rhlwtuwfhhqp7mg6sebrxc3 访问令牌秘密:i1f4t7j65oo8ydtnteub9xr7wrswe99c
Magento标题: 响应标题 Access-Control-Allow-Credentials:True Access-Control-Allow-Headers:Origin,Content-Type,Accept,Authorization 访问控制允许方法:GET,POST,OPTIONS,PUT,DELETE Access-Control-Allow-Origin:*
答案 0 :(得分:1)
之前我遇到过类似的问题,我将其跟踪到this method,其中没有检查->isOptions()
。因此,来自其他域的每个API调用都会触发Request method is invalid
异常。
/**
* Retrieve current HTTP method.
*
* @return string
* @throws \Magento\Framework\Exception\InputException
*/
public function getHttpMethod()
{
if (!$this->isGet() && !$this->isPost() && !$this->isPut() && !$this->isDelete()) {
throw new \Magento\Framework\Exception\InputException(new Phrase('Request method is invalid.'));
}
return $this->getMethod();
}
如果您使用的是apache,可以在github forum中找到可能的解决方法。
在我的特定情况下,我最终做的是从同一个域提供前端和api,以避免CORS出现问题(我使用nginx)。
这需要的配置示例如下:
location ~ ^/(index.php/)?rest {
try_files $uri $uri/ /index.php?$args;
}
location / {
root /var/www/angular/public/;
index index.html;
}