我写了一个角应用程序,它是rails应用程序的一部分。我们的想法是,第三方网站可以在其页面中创建一个脚本标记,指向我希望我的应用程序显示的rails方法。
在我的rails控制器中,我有逻辑返回原始javascript,如下所示......
def job_board
div_init_script =
"var jobBoardDiv=document.getElementById('#{div_id}');" \
"jobBoardNgView=document.createElement('ng-view');" \
'jobBoardDiv.appendChild(jobBoardNgView);' \
"jobBoardDiv.setAttribute('ng-app','jobBoard');"
url = Rails.application.config.api_url
contents = Rails.cache.fetch 'api_js' do
file_contents = File.read("#{Rails.root}/public/app/app.js")
"(function(){ var hookApiUrl = { apiUrl: '#{url}'};#{file_contents}})();"
end
send_data div_init_script + contents, type: 'text/javascript', disposition: 'inline'
end
所以,回顾一下,我的网站返回在另一个网站内执行的原始javascript,我的javascript获取/发布到我网站的api端点。
我遇到了这个要点让CORS正常工作 - https://gist.github.com/dhoelzgen/cd7126b8652229d32eb4 - 当我在rails服务器本地运行它时,所有的标题都被添加到每个请求中。
但是,当我设置在我的localhost上运行页面的场景时,CORS将无效,该脚本src设置为我站点的job_board端点。从我读过的内容,angular为$ http.get和post方法添加了一个预检检查,这些方法是上面链接的gist“应该”处理的代码的预检检查部分。但是当我在运行我的应用程序时查看控制台时,我看不到对失败的调用进行任何预检。只需一次呼叫,不添加任何访问控制标头。我不知道在这一点上还有什么地方可去。有人可以提出任何建议吗?感谢。
答案 0 :(得分:0)
如果是飞行前检查,则应该尝试运行" OPTIONS"方法。这是chrome调试器告诉你的吗?
使用chrome调试器网络选项卡,查看REQUEST和RESPONSE标头。这应该可以让你更好地了解发生/失败的原因。
EDIT 您的服务器没有使用正确的CORS标头进行响应。
至少,您需要服务器响应" Access-Control-Allow-Origin"和"访问控制 - 允许 - 方法"在你的标题中。例如:
"Access-Control-Allow-Origin" value="http://yourclienturi.com"
"Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, HEAD, OPTIONS"
"Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept"