jQuery Ajax – 来自Localhost的POST生成没有’Access-Control-Allow-Origin’标头

我以为我理解CORS,但有些东西我显然不明白。 我有一个应用程序,我试图从localhost运行。 此应用程序需要向Azure搜索发送请求。 我正在尝试上传搜索文档。 为了做到这一点,我有以下内容:

var url = 'https://my-app.search.windows.net/indexes/test/docs/index?api-version=2015-02-28'; $.ajax({ url: url, type: 'POST', contentType:'application/json', headers: { 'api-key':'XXXXXX', 'Content-Type':'application/json' }, beforeSend: function (req) { req.setRequestHeader('Access-Control-Allow-Origin', '*'); }, data: JSON.stringify({ '@search.action':'upload', 'id': '1', 'name': 'some name' }), success: function() { alert('success'); }, error: function() { alert('check the console window.'); } }); 

当然, urlapi-key不是真正的。 不过,如果我使用POSTman,我可以成功发布这些数据。 然而,当我尝试通过jQuery从我的应用程序发布它时,我在控制台窗口中收到错误消息:

 Failed to load resource: the server responded with a status of 403 (Forbidden) Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:72' is therefore not allowed access. The response had HTTP status code 403. 

我将Azure搜索服务的“允许的原始类型”CORS选项设置为“全部”。 所以基本上,它是开放的。 然而,我仍然得到这个CORS错误。

如何从localhost上的jQuery向此服务发布数据?

Azure搜索仅允许通过CORS执行查询操作,而不是管理或索引操作(有关Azure搜索支持CORS的详细信息,请参阅MSDN )。

这样做的原因是基于浏览器的客户端需要访问api-key,并且共享管理密钥(这是索引写入操作所必需的)本质上是不安全的。 对于索引中的数据应该是公开可用的情况,公开披露查询键是可以的,但是您永远不应该将管理API密钥交给基于浏览器的客户端。

Interesting Posts