如何使用 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。
我正在尝试下载(获取)一个包含 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。