在你说还有另一篇文章( jQuery $.ajax(), $.post sending "OPTIONS" as REQUEST_METHOD in Firefox )之前,是的,它根本没有帮助,所以..
我正在使用 Chrome 开发最新版本,当我尝试像这样将文件发送到远程视频转换器服务的 API 时,它可以工作(一切都在 CoffeeScript 中)让我们将此代码称为 1:
json_string = getNewSignedParams()
xhr = new XMLHttpRequest
xhr.open('POST', some_url, true)
xhr.setRequestHeader("Cache-Control", "no-cache")
xhr.setRequestHeader("Content-Type", "application/octet-stream")
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
xhr.setRequestHeader("X-File-Name", some_file.name || some_file.fileName)
xhr.setRequestHeader("X-Query-Params", json_string)
xhr.send some_file
上面的代码返回 200 并且可以正常工作。但我的页面上有 jQuery,所以我想我会使用它,所以我有一个上面的 jQuery 版本,如下所示。我们将此代码称为 2:
$.ajax
url: some_url
type: 'post'
data: some_file
processData: false
beforeSend: (xhr) ->
xhr.setRequestHeader("Cache-Control", "no-cache")
xhr.setRequestHeader("Content-Type", "application/octet-stream")
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
xhr.setRequestHeader("X-File-Name", some_file.name || some_file.fileName)
xhr.setRequestHeader("X-Query-Params", json_string)
success: ->
console.log 'success'
我收到此 400(错误请求),表示 Access-Control-Allow-Origin 不允许 Origin http://127.0.0.1:3000。
但是得到这个,如果我取消注释代码 1 并注释掉代码 2 并刷新页面并上传文件,这将成功,然后注释掉代码 1 并取消注释代码 2 并刷新页面并上传文件,现在代码 2 不会抛出 400 Bad request 错误!!
但是,如果我关闭整个浏览器,并加载使用代码 2 的页面,则无论我尝试多少次,上传文件都会出现 400 错误。然后,如果我按照上一段描述的操作,代码 2 就会起作用!
还有一件事,Chrome 控制台中的网络日志显示我使用代码 2 发出的请求将“OPTIONS”作为请求方法。而在代码1中,请求方法是“POST”
有人知道这是怎么回事吗?
请您参考如下方法:
这似乎是一个跨站点脚本问题:URL 实际上可能是问题所在。该 URL 可能与发出请求的脚本位于不同的主机上。出于安全原因,浏览器不允许这样做。
