2

API(レール)リクエストを作成するために角度2を使用しています。 HTTPリクエストを角度を使って作成すると、次のエラーが発生します。 XMLHttpRequestはhttps://api-urlをロードできません。プリフライト要求への応答がアクセス制御チェックを通過しない:要求されたリソースに「アクセス制御許可」がない。 Origin 'http://localhost:4200'はアクセスできません。応答にHTTPステータスコード404がありました。 しかし、私がPostmanまたはブラウザ自体からリクエストを作成しようとすると、エラーは発生しません。私は宝石「jsonapi-resources'toオープンAPを使用して、私のレールのサーバーでAccess-Control-Allow-Originの角度要求時のエラー

makeRequest() { 
    let user = {"user": "user", "password": "password"}; 
    let headers: Headers = new Headers(); 
    headers.append('Authorization', 'Basic ' + btoa(user.user + ':'+user.password)); 
    headers.append('Content-Type', 'application/vn.api+json') 
    let this.http.get(api-url, {headers: headers}).map(res => res.json()).subscribe(data => { 
    this.data = data; 
    }) 
} 

:データが正常に 角度コードを表示されます。私のAPIコントローラでは、私が要求にヘッダを認証し、設定するには、このコードを持っている:

module Api 
    class ApiController < JSONAPI::ResourceController 
    prepend_before_action :set_headers, :authenticate 

    def context 
     { current_station: @user } 
    end 

    private 

    def authenticate 
     authenticate_or_request_with_http_basic do |token, _| 
     @user = User.where(api_key: token).first 
     end 
    end 

    def set_headers 
     response.headers["Access-Control-Allow-Origin"] = "*" 
    end 
    end 
end 

私はブラウザやpostamanを使用して要求を行うと、ヘッダが正常に表示されますが、角度で、私はエラーを持っています。

答えて

2

CORSのためです。簡単に言えば、ブラウザは、AJAXリクエストを別のドメイン(AYAX)のリクエスト(http://api-url)にするために、デフォルトでは1つのドメイン(http://localhost:4200)を禁止しています。これは拡張機能であり、CORSは適用されないので、 "郵便配達"で動作します。この問題を解決するには、CORS接続を許可するという特定のヘッダーをクライアントに返すようにサーバーを構成する必要があります。

実際に、WebサイトがAJAXリクエストを別のドメインに作成しようとすると、最初にOPTIONという要求が送信され、ドメインの許可が求められます。このリストは、サーバによってヘッダAccess-Control-Allow-Originを介して返されます。たとえば、誰でもこのサーバーにAJAX呼び出しを行うことができることを示すために、星座(「*」)を含めることができます。このヘッダーによってクライアントがAJAX呼び出しを行うことができる場合は、実際の要求が実行されます。そうでない場合は、エラーが発生します(現在入手しているもの)

関連する問題