Я проверил упомянутый пост, во-первых, он не имеет ничего общего с 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);
}
И теперь я получаю все эти ошибки (почему они не могут написать четкую документацию, понятную людям :(
<iframe>
, но доступ к документу также будет строго ограничен политикой единого происхождения. - person georgeawg   schedule 30.08.2017getWeatherForecast() { 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$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