Angular 2:如何处理预检的响应有无效的HTTP状态代码400.错误的请求

时间:2017-04-12 09:15:21

标签: angular

我正在尝试使用我的magento的Rest api获取HTTP GET请求。

下面是达到相同的angular2代码!。

 public ngOnInit() {
    let headers = new Headers({ 'Accept': 'application/json' });
    headers.append('Authorization', 'Bearer x9a278mu7xoh4k0jkj08doc5j4b3ac22');
    headers.append('Access-Control-Allow-Headers', 'Content-Type');
    headers.append('Access-Control-Allow-Methods', 'GET');
    headers.append('Access-Control-Allow-Origin', '*');

    let options = new RequestOptions({ headers: headers });
    return this.http.get('http://10.2.../Mage_ang2/index.php/rest/V1/customers/1',options)
        .map(response => console.log(response.json))
        .subscribe((items: Person[]) => {
            console.log('items: ' + items);
            this.people = items;
        }, error => console.log(error));

 }

我得到(我假设)一个CORS问题。

  

选项http://10.2.../Mage_ang2/index.php/rest/V1/customers/1

     

XMLHttpRequest无法加载http://10.2.../Mage_ang2/index.php/rest/V1/customers/1。预检的响应具有无效的HTTP状态代码500

我在谷歌解决方法之后尝试了以下步骤来修复相同但不成功。

1)在magento .htaccess文件中,添加了

标题集设置Access-Control-Allow-Origin“*”

2)在上面添加的角度2代码中,

headers.append('Access-Control-Allow-Headers','Content-Type'); ...

...

3)尝试从

中的application / json更改内容类型

let headers = new Headers({'Accept':'application / json'});

我缺少什么。

需要正确的解决方案来修复CORS(从magento2到angular2)问题。

建议欢迎!

1 个答案:

答案 0 :(得分:2)

Header set Access-Control-Allow-Origin "*"

从安全角度来看,对Magento进行全球跨域访问(我理解这是一个购物平台)听起来是一个非常糟糕的主意。

headers.append('Access-Control-Allow-Headers', 'Content-Type'); ...

Access-Control-Allow-Headers是一个响应标头。服务器必须将其发送到客户端,而不是相反。您的JS无法授予其访问其他服务器的权限。

let headers = new Headers({ 'Accept': 'application/json' });

您是否有理由认为服务器因默认设置而引发错误?

返回并查看错误消息:

  

预检的响应包含无效的HTTP状态代码500

然后做一些基础研究来学习what a preflight is

然后再进行一些基础研究,找出what HTTP status code 500 means

所以:

  • 浏览器正在发出OPTIONS请求
  • 服务器正在响应 500内部服务器错误(可能是因为它没有被编程为响应OPTIONS请求)。

这意味着您需要查看服务器端代码(根本不是您的JS),并确定为什么它会导致500错误。您的服务器的错误日志将是一个开始寻找的好地方。

您需要让服务器按照the CORS documentation中的规则正确回复OPTIONS请求。

(或者,使用相同的说明,您可以尝试阻止浏览器首先发出预检请求,这可能就像删除所有尝试在请求中设置CORS响应标头一样简单#39;属于)。