Служба AngularJS $http имеет проблему с CORS. Но это должно работать для JSONP, верно?

Я проверил упомянутый пост, во-первых, он не имеет ничего общего с AngularJS, во-вторых, ответ на этот пост: И НЕТ, вы не можете использовать JSONP для получения данных html.

Почему мой пост дублируется, чем в том другом посте ответ говорит - вы не можете этого сделать, а здесь люди говорят, что я могу (через $sce)? Кто прав?

В основном я хочу сделать эту работу:

Когда я использую $http.get:

getWeatherForecast() {
    return this.$http.get('https://weather.gc.ca/city/pages/on-143_metric_e.html');
}

Я получаю исключение:

XMLHttpRequest не может загрузить https://weather.gc.ca/city/pages/on-143_metric_e.html. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:8080' запрещен.

Ясно - проблема CORS.

Но это должно работать для JSONP, верно?

Когда я использую $http.jsonp:

getWeatherForecast() {
    return this.$http.jsonp('https://weather.gc.ca/city/pages/on-143_metric_e.html');
}

Я получаю исключение:

angular.js:14642 Ошибка: [$sce:insecurl] http://errors.angularjs.org/1.6.5/$sce/insecurl?p0=https%3A%2F%2Fweather.gc.ca%2Fcity%2Fpages%2Fon-143_metric_e.html по адресу http://localhost:8080/node_modules/angular/angular.min.js:7:76 на сайте getTrusted (http://localhost:8080/node_modules/angular/angular.min.js:157:67) в Object.c.(анонимная функция) [как getTrustedResourceUrl] (http://localhost:8080/node_modules/angular/angular.min.js:158:352) по адресу q (http://localhost:8080/node_modules/angular/angular.min.js:103:257) по адресу http://localhost:8080/node_modules/angular/angular.min.js:102:8 в http://localhost:8080/node_modules/angular/angular.min.js:136:167 в m.$digest (http://localhost:8080/node_modules/angular/angular.min.js:147:70) на m.$apply (http://localhost:8080/node_modules/angular/angular.min.js:150:281) на gapi.client.init.then (http://localhost:8080/app/google.auth.js:26:33) по адресу h.r2 (https://apis.google.com//scs/apps-static//js/k=oz.gapi.en_GB. F7DGotPmXwE.O/m=auth2,client/rt=j/sv=1/d=1/ed=1/am=AQ/rs=AGLTcCNq_HS-9xmY0NiaH7I_fyUJGoSh1Q/cb=gapi.loaded_0:107:107) "Возможно, необработанный отказ: {}"

Полный сервисный код:

Не знаю, как использовать $sce, исходная документация по AngularJS абсолютно непонятна. Измененный код на это, теперь он выдает много других исключений:

namespace AppDomain {
    export class GoogleService {
        static $inject: string[] = ['$q', '$http', '$sce'];
        constructor(private $q: ng.IQService, 
                    private $http: ng.IHttpService, 
                    private $sce: ng.ISCEService) {
            console.log('GoogleService');
        }

        getWeatherForecast() {
            let url = 'https://weather.gc.ca/city/pages/on-143_metric_e.html';
            this.$sce.trustAsResourceUrl(url);
            return this.$http.jsonp(url).then(response => {
                var xxx = response;
            }, response => {
                var yyy = response;
            })
        }

    angular.module('app').service('GoogleService', GoogleService);
}

И теперь я получаю все эти ошибки (почему они не могут написать четкую документацию, понятную людям :(

введите здесь описание изображения


person monstro    schedule 30.08.2017    source источник
comment
Мне не нужен json, мне нужен HTML   -  person monstro    schedule 30.08.2017
comment
Почему бы вам не ввести $sce и не доверять URL-адресу вот так?   -  person Kyle Krzeski    schedule 30.08.2017
comment
я не знаю что это такое   -  person monstro    schedule 30.08.2017
comment
Я не понимаю, как его использовать из документации, пожалуйста, взгляните на мой обновленный пост, это правильный способ его использования? Также кто-то запостил На этот вопрос уже есть ответ здесь: и ответ в том посте - это то, что вы не можете сделать это, получить html через jsonp - так кто прав?   -  person monstro    schedule 30.08.2017
comment
Политика единого происхождения применяется браузером и Фреймворк AngularJS не может его переопределить. Используйте $sce, если хотите загрузить документ в элемент <iframe> , но доступ к документу также будет строго ограничен политикой единого происхождения.   -  person georgeawg    schedule 30.08.2017
comment
Сделайте это вместо этого: getWeatherForecast() { return this.$http.get('https://cors-anywhere.herokuapp.com/https://weather.gc.ca/city/pages/on-143_metric_e.html'); }. То есть измените URL в своем запросе на https://cors-anywhere.herokuapp.com/https://weather.gc.ca/city/pages/on-143_metric_e.html. Объяснение см. в разделе Как использовать прокси-сервер CORS, чтобы обойти проблемы «Нет заголовка Access-Control-Allow-Origin» в разделе ответа на stackoverflow.com/questions/43871637/   -  person sideshowbarker    schedule 31.08.2017
comment
$http.jsonp работает, потому что под ним просто добавляется элемент script в DOM с URL-адресом его атрибута src, установленным на URL-адрес запроса из вашего кода. Это работает с разными источниками, потому что браузер позволяет script элементам иметь атрибут src с URL-адресом из другого источника. Таким образом, в отличие от $http.get, $http.jsonp не вызывает XHR за кулисами. Вот почему $http.jsonp работает в этом случае, даже если сервер, на который отправляется запрос, не поддерживает CORS. Запрос $http.get завершается ошибкой, потому что он использует XHR, и для его работы сервер, на который направляется запрос, должен поддерживать CORS.   -  person sideshowbarker    schedule 31.08.2017