所以我有一个远程服务器,它应该是一个REST API:对http://api/somehting
的GET请求返回一个json响应。 REST API是用python写的,因此响应的构造是
from flask import jsonify
return jsonify(status=200, response="TEST")
当我访问浏览器并粘贴该链接时,我得到了回复。当我使用POSTMAN并向该链接发送GET请求时,显然它可以正常工作。
但是这里有javascript(typescript)。我开始编写一个角度应用程序,我已经创建了一个服务,它应该先从同一个链接获取该数据。代码如下:
getProducts(): Observable<IProduct[]> {
return this._http.get<IProduct[]>(this._productUrl).do(data => console.log(
"All: " + JSON.stringify(data))).catch(this.handleError);
}
现在,当执行此功能时,我在浏览器中收到此错误:
阻止跨源请求:同源策略禁止在http://api/somehting读取远程资源。 (原因:缺少CORS标题'Access-Control-Allow-Origin'。
所以我的问题是:
1)为什么我不会在邮递员或网络浏览器上出现错误,但我会使用角度应用程序?我该如何解决这个问题?
2)这只是一个JSON响应。我在json正文中包含了所有信息。它旨在为任何人提供请求它的响应。为什么我甚至得到这个“同源策略”错误?
3)如何使我的API作为您发送请求并获得答案的任何其他公共API?
答案 0 :(得分:4)
为什么我不会在邮递员或网络浏览器上收到错误,但我会使用角度应用程序?我该如何解决这个问题?
Postman并不关心相同的原始政策,这是浏览器实施的。通过URL栏直接调用API时,它具有类似的行为。所以没有什么可以修复的,因为它按预期工作。
这只是一个JSON响应。我在json正文中包含了所有信息。它旨在为任何人提供请求它的响应。为什么我甚至得到了这个&#34;同源政策&#34;错误? 强>
这是浏览器实施的安全措施,以保护用户免受恶意网站访问其他网站的敏感数据(例如Facebook帐户,网上银行等)。浏览器不关心请求的内容(JSON,XML,字符串),它只是知道您正在尝试将AJAX创建到不同的域。因此它将触发相同的原始政策。
如何让我的API充当您发送请求并获得回复的任何其他公共API?
如果您需要公共API,可以添加&#34; Access-Control-Allow-Origin:*&#34;到服务器的响应头。这告诉浏览器任何域可以调用您的服务器。