连接以获取数据

时间:2014-03-17 09:51:49

标签: ruby-on-rails ruby api

在我的项目中,我必须集成库并解析以csv格式呈现的文件。要访问库并从该文件获取信息,我使用$ ajax,如下所示:

<script>
  $(document).ready(function(){
  $.ajax({
      type: "GET",
      url: "http://stats.xxx.tv/osexternal/reports/xxxxx/xxx_2014_YTD/2014-03-12.csv",
      contentType: 'application/json',
      dataType: 'json',  
      username: 'xxxx@xxxx.com',
      password: 'dT$xxxx%949',
      success: function (){
          console.log('success');
      },
      error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus, errorThrown);
      }
     });
  });
<script>

任何人都可以让我知道这种方法有什么问题,因为我遇到跨域问题。请通过使用宝石让我知道任何替代方案。 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您遇到的似乎是某种CORs问题。有关CORs问题的注意事项:

  • 这是Javascript的安全策略,因此它只会影响JS中的调用。
  • 能够直接从浏览器访问它&#39;与CORs没有任何关系
  • CORS真的很烦人

现在,关于如何解决它,您可以尝试添加:

with_credentials: true对Ajax的论点,但我感觉它会变得更奇怪......因为你必须包含一个用户名密码它最好不要在客户端暴露那些任何人......

所以,我要做的是在服务器上进行调用(例如,对于rails控制器操作,但该方法可以在Sinatra应用程序中使用),然后将CSV返回到浏览器:

require 'net/http'
class MyController < ActionController::Base
  # ...
  def get_csv
    uri = URI('http://stats.adap.tv/osexternal/reports/xxxxx/xxx_2014_YTD/2014-03-12.csv')
    csv_request = Net::HTTP::Get.new(uri)
    csv_request.basic_auth("username", "password")
    csv_data = csv_request.request.body
    csv
  end
end

我假设你使用Ruby是因为你的宝石&#34;参考。这是 Net :: HTTP doc

http://ruby-doc.org/stdlib-2.1.1/libdoc/net/http/rdoc/Net/HTTP.html

和稍微容易理解的版本:

http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

一般来说,让服务器向外部主机发出请求总是更容易(也更安全)(这是一个广泛的概括,并且绝对有这样的情况,这不是你想要的)。如果您需要提出跨域请求,我建议从以下开始:

http://www.html5rocks.com/en/tutorials/cors/

它可能会给你一些很好的提示,以找出它目前无法正常工作的原因。

最佳,