Cors请求在Excel中工作,但不在Javascript中工作

Cors请求在Excel中工作,但不在Javascript中工作,javascript,excel,cors,vba,Javascript,Excel,Cors,Vba,我了解CORS策略,由于服务器未设置为接受CORS请求,因此我无法从其他来源下载CSV文件。然而,当从Excel中的VBA发出请求时,服务器似乎非常乐意满足请求。那么为什么我不能使用Javascript获取相同的文件呢 在Excel中: Sub transfercsv() sCSVLink = "https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation" sfile = "Filename_Specif

我了解CORS策略,由于服务器未设置为接受CORS请求,因此我无法从其他来源下载CSV文件。然而,当从Excel中的VBA发出请求时,服务器似乎非常乐意满足请求。那么为什么我不能使用Javascript获取相同的文件呢

在Excel中:

Sub transfercsv()
sCSVLink = "https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation"
sfile = "Filename_Specific_Location_" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & ".csv"
ssheet = "CSV Transfer"
Set wnd = ActiveWindow
Application.ScreenUpdating = False
Sheets(ssheet).Cells.ClearContents
Workbooks.Open Filename:=sCSVLink
Windows("pending_CSV").Activate
ActiveSheet.Cells.Copy
wnd.Activate
Sheet1.Select
Sheets("CSV Transfer").Range("A1").Select
Sheets("CSV Transfer").Paste
Application.DisplayAlerts = False
Windows("pending_CSV").Activate
Windows("pending_CSV").Close False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Call anotherFunc
End Sub
在Javascript中:

function displayData(){
    //this function takes a csv and displays it as a table in the page
  var tabulate = function (data,columns) {
      var table = d3.select('body').append('table')
        var thead = table.append('thead')
        var tbody = table.append('tbody')
        thead.append('tr')
          .selectAll('th')
            .data(columns)
            .enter()
          .append('th')
            .text(function (d) { return d })
        var rows = tbody.selectAll('tr')
            .data(data)
            .enter()
          .append('tr')
        var cells = rows.selectAll('td')
            .data(function(row) {
                return columns.map(function (column) {
                    return { column: column, value: row[column] }
              })
          })
          .enter()
        .append('td')
          .text(function (d) { return d.value })
      return table;
    }
    //this function actually makes the xhr request and gets the csv
    d3.csv('https://subdomain.domain.com/specific_page/pending_csv?var=specificLocation',function (data) {
        var columns = ['column_name_1','column_name_2','column_name_3','column_name_4','column_name_5','column_name_6','column_name_7','column_name_8','column_name_9','column_name_10','column_name_11']
      tabulate(data,columns)
    })
所以上面的Excel代码对我来说没问题,但是上面的Javascript代码给了我一个安全错误:

已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:缺少CORS标头“访问控制允许原点”)

而且,我无法控制服务器。该应用程序由我公司的另一个团队控制(在不同的位置)。我很惊讶CORS有效,因为我的域是:mydomain.somebs.domain.com他们的域是:theirdomain.domain.com,所以我不能在他们的服务器策略中只接受我的子域


所以应该有一种方法让我能够正确地使用Javascript获取此资源?

这是因为CORS通常是一种浏览器策略,Excel不关心CORS策略,因为Excel实际上不容易受到浏览器每天都会遇到的情况(运行Javascript的假网站从真实站点提取数据)如果您所做的只是一个一次性的场景,您可以在浏览器中禁用CORS策略,但这对生产网站不起作用

我的建议是在服务器端脚本中使用一些php来下载CSV,然后打印其内容

类似于

<?php
echo file_get_contents('http://otherdomain.com/that_csv_file.csv');
?>


然后将javascript url指向您现在的“同一域”php脚本。

您可以控制服务器吗?为了允许CORS请求,您需要让服务器返回一个带有您的域(或
*
)的
访问控制允许来源
头作为值,正如您收到的错误所表明的那样。我想我应该更具体一些。我无法控制服务器。该应用程序由我公司的另一个团队控制(在不同的位置)。我很惊讶CORS有效,因为我的域是:mydomain.somebs.domain.com他们的域是:theirdomain.domain.com,所以我不能在他们的服务器策略中只接受我的子域。正在更新初始帖子。由于服务器返回csv,jsonp不是一个选项-我认为最干净的选项是联系负责服务器的团队,让他们添加CORS头并指定基本域:
Access control allow origin:https://domain.com
感谢您的快速建议。这是有效的回应。虽然我觉得没有意义,你不能用ajax从客户端抓取资源并摆弄它,但你可以从服务器端抓取资源,将数据注入javascript并摆弄它。。。我得多了解一下CORS应该防止什么。