如何使用 Angular4 将网站下载为字符串?

How can I download a website as string with Angular4?

我正在尝试下载(获取)一个包含 returns 字符串的网页,而不是 XML 而不是 JSON。

基本上有什么方法可以像 C# 中的 WebClient.DownloadString 一样在 Angular4 中将网页下载为字符串?

注: 一开始我以为我可以使用 http 方法(observables、promises、JSONP)来下载一个网站。但无论如何我试过了。

据我所知,我无法使用 JSONP,因为它将结果解析为 json,并且我收到错误消息,因为响应是字符串而不是 JSON .

并且 observables 和 promises 失败了,因为我得到了 CORS 错误。而且我不确定为什么我会收到 CORS 错误,因为它不是 RESTful 服务、WCF 或 Web api 等。

请求的资源上没有 'Access-Control-Allow-Origin' header。

我也试过 HttpClient 但我又遇到了 CORS 错误。

所以我相信 Angular 中应该有一些其他方法或组件或模块来将网页下载为字符串。

抱歉,Same Origin Policy 阻止您的网站从其他域下载网站。同源策略适用于每个 Web 请求。无论是网站还是 REST API 都没有区别。

围绕同源策略有多种方式:

  • 目标网络服务器可以通过设置CORS-header Access-Control-Allow-Origin来配合。 (CORS 知道评论中提到的 "simple request" 的概念,但这并不相关。"simple request" 是一个不会触发 pre-request 的请求。但是跳过 pre-request 不允许您访问响应,您仍然需要 Access-Control-Allow-Origin 响应 header).

  • 您可以将您的网站转换为可安装的应用程序或浏览器扩展程序

  • 您可以在您的域中提供服务器端脚本,将请求代理到目标域。请谨慎使用此选项,因为它可能很容易被第三方滥用,除非您采取额外步骤(例如 white-listing 目的地、速率限制和日志记录)。

您可以使用 CORS 代理来获取不发送的网站的内容Access-Control-Allow-Origin这是一个简单的例子:

const proxyurl = "https://cors-anywhere.herokuapp.com/";
const requesturl = "https://google.com";
fetch(proxyurl + requesturl)
    .then(response => response.text())
    .then(text => document.querySelector("pre").textContent = text)
<pre></pre>

那里发生的事情是这样的:

如果站点本身不发送 Access-Control-Allow-Origin 响应 header,那么浏览器将阻止您的前端 JavaScript 代码在您访问该站点时访问响应使用 JavaScript 库中的 Fetch API 或 XHR 或 Ajax 方法向它发出请求。

但是使用 URL https://cors-anywhere.herokuapp.com/https://google.com 导致请求通过 https://cors-anywhere.herokuapp.com 发出,一个开放的 CORS 代理将请求转发到 https://google.com 然后接收响应从中。 https://cors-anywhere.herokuapp.com 后端将 Access-Control-Allow-Origin header 添加到响应中并将其传递回您的请求前端代码。

然后浏览器将允许您的前端代码访问响应,因为带有 Access-Control-Allow-Origin 响应 header 的响应是浏览器所看到的。

您还可以使用 https://github.com/Rob--W/cors-anywhere/

轻松设置自己的 CORS 代理

有关当您使用 XHR 或 [=50= 中的 Fetch API 或 AJAX 方法从前端 JavaScript 代码发送 cross-origin 请求时浏览器执行的操作的详细信息] 库——以及关于必须接收什么响应 header 以便浏览器允许前端代码访问响应的详细信息——参见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS