Я бы хотел перехватывать запросы XHR для API Карт Google, чтобы я мог запускать их через собственный прокси-сервер, чтобы сохранить конфиденциальность моего ключа API.
Angular имеет свои собственные HttpInterceptor
s, но они будут перехватывать только XHR-запросы, сделанные с помощью HttpClient
Angular, а не любые запросы, сделанные вне рамок Angular посредством API-интерфейса Maps. Я бы подумал, что исправление обезьяны XMLHttpRequest.open()
будет лучшим способом получить доступ к запросам к API Карт, что я и сделал следующим образом:
var oldXHROpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, username, password) {
console.log(url);
return oldXHROpen.apply(this, arguments);
};
Приведенный выше код помещен в <script>
в секции <head>
моего index.html
, поэтому он обязательно выполняется перед выполнением любого кода Angular.
Патч работает ... на короткое время. Я вижу URL для нескольких ресурсов, загруженных моим кодом, вышли из системы, но затем появляется это сообщение:
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
После этого регистрируется еще один URL, и это последний перехват, который я делаю. XHR-запросы продолжают обрабатываться, но мой патч никогда не видит, чтобы они происходили.
Я уверен, что это как-то связано с zone.js, но я до сих пор не понимаю, как это могло произойти. Поскольку я переопределяю XMLHttpRequest.prototype.open
до того, как Angular или zone.js даже получат возможность увидеть оригинальную функцию open()
, которая скрыта в переменной oldXHROpen
, как прямое соединение с нативным open()
когда-либо удается случится снова, минуя мой патч?