Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 当端点不存在时,如何解决CORS问题';你不接受期权法吗?_Angular_.htaccess_Magento_Ionic2 - Fatal编程技术网

Angular 当端点不存在时,如何解决CORS问题';你不接受期权法吗?

Angular 当端点不存在时,如何解决CORS问题';你不接受期权法吗?,angular,.htaccess,magento,ionic2,Angular,.htaccess,Magento,Ionic2,我正在为易于管理的Magento电子商务商店构建移动客户端应用程序,我;我使用基于令牌的身份验证,我使用ionic2作为我的移动框架 我的问题是,由于端点不支持选项方法,因此将角度HTTP发送到选项请求,而不是POST到产生400错误请求的端点 这是我的代码: import { Injectable } from '@angular/core'; import { Http, Headers, RequestOptions } from '@angular/http';

我正在为易于管理的Magento电子商务商店构建移动客户端应用程序,我;我使用基于令牌的身份验证,我使用ionic2作为我的移动框架

我的问题是,由于端点不支持
选项
方法,因此将角度HTTP发送到
选项
请求,而不是
POST
到产生
400错误请求的
端点

这是我的代码:

    import { Injectable } from '@angular/core';
    import { Http, Headers, RequestOptions } from '@angular/http';
    import 'rxjs/add/operator/map';
    import { BaseConfig } from '../../config';
    
    @Injectable()
    export class AuthProvider {
    
      public data: any;
    
      public option: any;
    
      constructor(public http: Http) {
        console.log('Hello AuthProvider Provider');
    
      }
    
      login(creds: any) {
        
        let headers = new Headers({
          'Content-Type': 'application/json'
        });
    
        let option = new RequestOptions({
          headers: headers,
        });
    
        return new Promise((resolve) => {
          this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
            .map(res => res.json())
              .subscribe((data) => {
                resolve(this.data);
              },
              (error) => {
                resolve(this.data);
              }
            );
        });
    
      }  
  
   }
我还在.htaccess上包含CORS头

Header add Access-Control-Allow-Origin: "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: "Content-Type"
所以真正的问题是如何防止使用
OPTIONS
方法请求角度http(我认为这是不可能的,因为是预引导请求)


谢谢

您可以在两者之间添加自己的服务器(如代理服务器),该服务器(从同一URL+端口加载HTML内容时不需要CORS)
或者您可以使用JSONP,尽管它非常有限


否则,您需要将服务器配置为支持
选项
OPTIONS
请求是一个飞行前请求,如果浏览器没有从
OPTIONS
请求中获得预期的响应,则不会发出
POST
请求。

可能在下面的示例中,它可以为您提供所需的东西

login(creds: any) {

        let headers = new Headers({
          'Content-Type': 'application/json',
        });

        let option = new RequestOptions({
          headers: headers,
          withCredentials:true
        });

        return new Promise((resolve) => {
          this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
            .map(res => res.json())
              .subscribe((data) => {
                resolve(this.data);
              },
              (error) => {
                resolve(this.data);
              }
            );
        });

      } 

我不知道原因,但我认为您应该在真正的设备上试用。

您不能更改后端以接受
选项
请求吗
CORS
请求不是一个角度问题,而是一个浏览器问题。这是CORS标准要求浏览器的行为方式。所以,我应该删除添加到.htaccess的自定义标题吗?在这种情况下,如果您从浏览器中运行的前端JavaScript直接向该端点发出请求,则无法避免预飞行-只要该端点要求文章的内容类型为“Content Type:application/json”或“内容类型:应用程序/xml“,它是根据。您唯一的选择是在前端JavaScript调用和服务器之间放置一些代理,或者只在后端代码中执行所有操作。我尝试使用Chrome扩展来实现这一点,但没有解决问题,,,我自己还没有尝试Chrome扩展来解决CORS问题,但我听说它是有效的。我不知道为什么它不适合你。ente siapa ya…?谢谢你的解决方案解决了我的问题:D我不知道为什么,但部署到真正的设备上成功了。。。。!