Подтвердить что ты не робот

Нет заголовка "Access-Control-Allow-Origin" в приложении Angular 2

Для этого проекта я просто изучаю и практикую Angular 2. У меня нет серверной стороны, и я делаю запросы API barchart ondemand api.

Мне интересно, можно ли обойти проблему cors. Я до сих пор довольно новичок в этом, поэтому детские инструкции очень ценятся! Я использую http://localhost:8080.

Сообщение об ошибке: (прокомментирован ключ api)

XMLHttpRequest cannot load http://marketdata.websol.barchart.com/getHistory.json?key=MY_API_KEY&symbol=GOOG&type=daily&startDate=20150311000000. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

StockInformationService:

import {Injectable} from 'angular2/core';
import {Http, Headers} from 'angular2/http';
import {Observable} from 'rxjs/Rx';

@Injectable()
export class StockInformationService {
    private apiRoot = "http://marketdata.websol.barchart.com/getHistory.json?key=MY_API_KEY&";

    constructor (private _http: Http) {}

    getData(symbol: string): Observable<any> {
        // Tried adding headers with no luck
        const headers = new Headers();
        headers.append('Access-Control-Allow-Headers', 'Content-Type');
        headers.append('Access-Control-Allow-Methods', 'GET');
        headers.append('Access-Control-Allow-Origin', '*');

        return this._http.get(this.apiRoot + "symbol=" + symbol + "&type=daily&startDate=20150311000000", {headers: headers})
            .map(response => response.json());
    }
}

Компонент приложения:

import {Component} from "angular2/core";
import {VolumeComponent} from '../../components/volume/volume';
import {StockInformationService} from '../../core/stock-information.service';

@Component({
    selector: 'app-shell',
    template: require('./app-shell.html'),
    directives: [VolumeComponent],
    providers: [StockInformationService]
})
export class AppShell {
    constructor(private _stockInformationService: StockInformationService) {}

    // In my template, on button click, make api request
    requestData(symbol: string) {
        this._stockInformationService.getData(symbol)
            .subscribe(
                data => {
                    console.log(data)
                },
                error => console.log("Error: " + error)
            )}
    }

}

В моей консоли ошибка requestData: Error: [object Object]

4b9b3361

Ответ 1

Это проблема с конфигурацией CORS на сервере. Неясно, какой сервер вы используете, но если вы используете Node + express, вы можете решить его с помощью следующего кода

// Add headers
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

этот код был ответ @jvandemo на очень похожий вопрос.

Ответ 2

Подробнее об этом вы можете узнать здесь: http://www.html5rocks.com/en/tutorials/cors/.

Ваши методы ресурсов не пострадают, поэтому их заголовки никогда не будут установлены. Причина в том, что перед фактическим запросом называется запрос предпросмотра, который является запросом OPTIONS. Таким образом, ошибка возникает из-за того, что запрос предполетности не создает необходимые заголовки. убедитесь, что вам нужно добавить следующее в файл .htaccess:

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

Ответ 3

У меня также была такая же проблема при использовании http://www.mocky.io/, что я сделал, чтобы добавить в заголовок ответа mock.io: Access-Control- Разрешить-Происхождение *

Чтобы добавить его, просто нужно нажать дополнительные параметры

Mock.io Header Example Как только это будет сделано, мое приложение сможет извлекать данные из внешнего домена.

Ответ 4

Просто вы можете установить в php файл как

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

Ответ 5

К сожалению, это не ошибка Angular2, ошибка, с которой работает ваш браузер (т.е. вне вашего приложения).

Этот заголовок CORS должен быть добавлен к этой конечной точке на сервере, прежде чем вы сможете делать ЛЮБЫЕ запросы.

Ответ 6

Я потратил много времени на решение и заработал, наконец, путем внесения изменений в серверную сторону. Проверите веб-сайт https://docs.microsoft.com/en-us/aspnet/core/security/cors

Это сработало для меня, когда я включил сервер на стороне сервера. Мы использовали ядро ​​Asp.Net в API и работали ниже код

1) Добавлены Addcors в ConfigureServices of Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors();
        services.AddMvc();
    }

2) Добавлен метод UseCors в Configure, как показано ниже:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors(builder =>builder.AllowAnyOrigin());
        app.UseMvc();
    }

Ответ 7

Я также столкнулся с той же проблемой и передал следующий способ решения этой проблемы.

шаг 1:

$ npm install --save-dev http-proxy-middleware

Шаг 2:

добавьте прокси-сервер, когда я получаю веб-api, если вы используете Lite-сервер, вы можете добавить файл bs-config.js.

//file: bs-config.js
var proxyMiddleware = require('http-proxy-middleware');

module.exports = {
    server: {
        middleware: {
            1: proxyMiddleware('/example-api', {
                target: 'http://api.example.com',
                changeOrigin: true,
                pathRewrite: {
                '^/news-at-api': '/api'
                }
            })
        }
    }
};

надеюсь, что это поможет.

Ответ 8

Если вы создаете макет с SoapUI, бесплатный инструмент для тестирования запросов и ответа REST и SOAP для Angular 2+, вы должны запомнить внутри своего запроса заголовка http

 Access-Control-Allow-Origin :  *

Я добавляю два изображения, чтобы помочь вам вставить. Первый показывает заголовок, который вы должны добавить. Если вы хотите добавить заголовок перед тем, как нажать кнопку "плюс" (он зеленый).

Первое изображение

Второе изображение показывает вставку *. Значение * позволяет принимать все запросы от разных хостов.

Второе изображение

После этой работы мое приложение Angular удалило эту раздражающую ошибку в моей консоли.

ошибка внутри консоли

Большое обращение, которое помогло мне понять, для создания моего первого макета, это видео. Это поможет вам создать новый макет внутри среды SoapUi без серверной стороны.

Ответ 9

У меня была такая же проблема, когда я практиковал Angular5. Затем я наткнулся на https://spring.io/guides/gs/rest-service-cors/, который помог мне решить проблему.

Я сохранил @CrossOrigin(exposedHeaders="Access-Control-Allow-Origin") в моем методе сопоставления запросов. Мы также можем настроить это глобально в приложении весенней загрузки.

Ответ 10

Еще один простой способ, не устанавливая ничего

  • Функция HTTP

    authenticate(credentials) {
    
    let body = new URLSearchParams();
    body.set('username', credentials.username);
    body.set('password', credentials.password);
    
    return this.http.post(/rest/myEndpoint, body)
      .subscribe(
      data => this.loginResult = data,
      error => {
        console.log(error);
      },
      () => {
      // function to execute after successfull api call
      }
      );
     }
    
  • Создайте файл proxy.conf.json

    {
     "/rest": {
    "target": "http://endpoint.com:8080/package/",
    "pathRewrite": {
      "^/rest": ""
    },
    "secure": false
    }
    }
    
  • затем ng serve --proxy-config proxy.conf.json (или) откройте package.json и замените

    "scripts": {
    "start": "ng serve --proxy-config proxy.conf.json",
     },
    

а затем npm start

Что это.

Отметьте https://webpack.github.io/docs/webpack-dev-server.html для получения дополнительных параметров

Ответ 11

У меня такая же ошибка, и вот как я ее решил, добавив следующее к вашему контроллеру spring:

@CrossOrigin(origins = {"http://localhost:3000"})

Ответ 12

В большинстве случаев это происходит из-за неверного типа ответа от сервера.

Убедитесь, что следующие 2, чтобы избежать этой проблемы.

  1. Вам не нужно устанавливать какие-либо заголовки CORS на угловой стороне. он очень хорошо знает, как с этим бороться. Angular ожидает, что возвращаемые данные будут в формате json. поэтому убедитесь, что тип возвращаемого значения - JSON даже для запроса OPTIONS.
  2. Вы обрабатываете CORS на стороне сервера, используя заголовок CORS, который не требует пояснений, или вы можете узнать, как установить заголовки CORS или промежуточное программное обеспечение.

Ответ 13

Если ничто не может помочь, попробуйте установить надстройку Access-Control-Allow-Origin * в свой браузер, как @Vikram R посоветовал здесь:

fooobar.com/info/1020733/...