Как добавить запрос CORS в заголовке в Angular 5

Я добавил заголовок CORS, но я все еще получаю проблему CORS в моем запросе. Каков правильный способ добавления и обработки CORS и других запросов в заголовках?

Вот код служебного файла:

import { HttpClient, HttpHeaders, HttpClientModule } from '@angular/common/http';
const httpOptions = {
  headers: new HttpHeaders({ 
    'Access-Control-Allow-Origin':'*',
    'Authorization':'authkey',
    'userid':'1'
  })
};

public baseurl = 'http://localhost/XXXXXX';

userAPI(data): Observable<any> {
  return this.http.post(this.baseurl, data, httpOptions)
    .pipe(
      tap((result) => console.log('result-->',result)),
      catchError(this.handleError('error', []))
    );
}

Ошибка:

Ответ на запрос предполетной проверки не проходит проверку контроля доступа. Нет заголовка "Access-Control-Allow-Origin" на запрошенном ресурсе. Origin 'http://localhost:4200', следовательно, не допускается доступ

не удалось: ответ об ошибке Http для (неизвестный url): 0 Неизвестная ошибка

В моем серверном коде я добавил CORS в индексный файл.

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

Ответ 1

CORS (совместное использование ресурсов Cross-Origin) - это способ для сервера сказать: "Я приму ваш запрос, даже если вы пришли из другого источника". Для этого требуется сотрудничество с сервером - поэтому, если вы не можете изменить сервер (например, если вы используете внешний API), этот подход не будет работать.

Измените сервер, чтобы добавить заголовок Access-Control-Allow-Origin: *, чтобы включить запросы перекрестного происхождения из любого места (или указать домен вместо *).

Ответ 2

По моему опыту плагины работали с HTTP, но не с последним httpClient. Кроме того, настройка заголовков ответов CORS на сервере на самом деле невозможна. Итак, я создал файл proxy.conf.json для работы в качестве прокси-сервера.

Подробнее об этом читайте здесь.

Файл proxy.conf.json:

{
  "/posts": {
    "target": "https://example.com",
    "secure": true,
    "pathRewrite": {
    "^/posts": ""
  },
    "changeOrigin": true
  }
}

Я поместил файл proxy.conf.json прямо рядом с файлом package.json в том же каталоге.

Затем я изменил команду запуска в файле package.json:

"start": "ng serve --proxy-config proxy.conf.json"

HTTP-вызов из моего компонента приложения:

return this._http.get('/posts/pictures?method=GetPictures')
.subscribe((returnedStuff) => {
  console.log(returnedStuff);
});

Наконец, чтобы запустить мое приложение, мне нужно будет использовать npm start или ng serve --proxy-config proxy.conf.json

Ответ 3

Сделайте так, чтобы заголовок выглядел так для HttpClient в NG5:

let httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'apikey': this.apikey,
        'appkey': this.appkey,
      }),
      params: new HttpParams().set('program_id', this.program_id)
    };

Вы сможете сделать вызов API с помощью URL вашего локального хоста, это работает для меня..

  • Пожалуйста, никогда не забывайте свой заголовок params в заголовке: например, params: new HttpParams(). Set ('program_id', this.program_id)

Ответ 4

POST с httpClient в Angular 6 также выполнял запрос OPTIONS:

Общие заголовки:

Request URL:https://hp-probook/perl-bin/muziek.pl/=/postData
Request Method:OPTIONS
Status Code:200 OK
Remote Address:127.0.0.1:443
Referrer Policy:no-referrer-when-downgrade

Мой сервер Perl REST реализует запрос OPTIONS с кодом возврата 200.

Заголовок следующего запроса POST:

Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:hp-probook
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36

Обратите внимание на Access-Control-Request-Headers: content-type.

Итак, мой бэкэнд-скрипт на Perl использует следующие заголовки:

 -"Access-Control-Allow-Origin" => '*',
 -"Access-Control-Allow-Methods" => 'GET,POST,PATCH,DELETE,PUT,OPTIONS',
 -"Access-Control-Allow-Headers" => 'Origin, Content-Type, X-Auth-Token, content-type',

С этой настройкой GET и POST работал для меня!

Ответ 6

пожалуйста, импортируйте requesttoptions из угловых сердечников

    import {RequestOptions, Request, Headers } from '@angular/http';

и добавьте параметры запроса в свой код, как указано ниже

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

опция отправки запроса в вашем запросе API

фрагмент кода below-

     let requestOptions = new RequestOptions({ headers:null, 
     withCredentials: true });
     return this.http.get(this.config.baseUrl + 
     this.config.getDropDownListForProject, requestOptions)
     .map(res => 
     {
      if(res != null)
      { 
        return res.json();
        //return true;
      }
    })
  .catch(this.handleError);
   }  

и добавьте CORS в свой бэкэнд-код PHP, где все запросы API будут в первую очередь.

попробуйте это и дайте мне знать, если это работает или нет, у меня была та же проблема, я добавил CORS из angular5, который не работал, тогда я добавил CORS в бэкэнд, и это сработало для меня

Ответ 7

Вы также можете попробовать функцию fetch и режим no-cors. Иногда мне проще настроить его, чем встроенный в Angular модуль http. Вы можете щелкнуть правой кнопкой мыши запросы на вкладке сети инструментов Chrome Dev и скопировать их в синтаксисе выборки, что отлично.

import { from } from 'rxjs';

// ...

result = from( // wrap the fetch in a from if you need an rxjs Observable
  fetch(
    this.baseurl,
    {
      body: JSON.stringify(data)
      headers: {
        'Content-Type': 'application/json',
      },
      method: 'POST',
      mode: 'no-cors'
    }
  )
);

Ответ 8

angular 2+ в основном создает такую проблему, в то время как ответ от серверного API не является допустимым JSON. Значит, ответ сервера печатается как веб-страница вместо ответа JSON.

Неверный ответ сервера

print $response;

правильный ответ

return $response;

Примечание: я столкнулся с проблемой в угловом приложении. Разработчик использует print для возврата ответа.

Ответ 9

Следующее сработало для меня после нескольких часов попыток

      $http.post("http://localhost:8080/yourresource", parameter, {headers: 
      {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' } }).

Однако следующий код не сработал, мне неясно, почему, надеюсь, кто-то может улучшить этот ответ.

          $http({   method: 'POST', url: "http://localhost:8080/yourresource", 
                    parameter, 
                    headers: {'Content-Type': 'application/json', 
                              'Access-Control-Allow-Origin': '*',
                              'Access-Control-Allow-Methods': 'POST'} 
                })

Ответ 10

Используя jsonp...

в приложении, вызывающем API:

import { HttpClient } from "@angular/common/http";

this.httpClient.jsonp("http://127.0.0.1:3001/scicat/Publication", "callback")
...

В вызываемом абоненте:

import { Request, Response } from "express";

// is commonly cross a cross origin request
export let getPublication = (req: Request, res: Response) => {
  logger.debug("Get publications request.");
  const dao = MongoConnector.getInstance();
  dao
    .getPublication(req.query)
    .then(response => {
      Response.jsonp(response);
    })
    .catch(oaiError => {
      Response.status(500);
      Response.jsonp(oaiError);
    });
};