0

这是要了我的命。尝试从我尝试编写的 API 类型的不同域加载数据。当将 JSON 参数作为 POST 发送时,它们会被丢弃,我在某处读到必须在 before_filter 设置一些特殊标头:

  def cors_headers #set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Max-Age'] = "1728000"
    headers['Access-Control-Allow-Headers'] = 'content-type, accept'
  end

虽然这些都没有运气。估计是浏览器限制。

当我尝试将数据作为 GET 而不是 POST 发送时,它会像这样添加到 URL:

Completed in 959ms (View: 0, DB: 2) | 200 OK [http://www.somedomain.com/connector/browse/Sport.json?callback=jQuery16105855946165975183_1379526705493&{%22filters%22:[{%22filter%22:{%22attribute%22:%22id%22,%22op
erator%22:%22%3E%22,%22value%22:%222%22}},{%22filter%22:{%22attribute%22:%22id%22,%22operator%22:%22%3C%22,%22value%22:%227523%22}}]}&_=1379526723982]

所以 Rails 基本上看不到过滤器,这些过滤器是我要发送的参数

  Parameters: {"{\"filters\":"=>{}, "id"=>"Sport", "_"=>"1379526723982", "callback"=>"jQuery16105855946165975183_1379526705493"}

我正在玩的 jquery 片段是:

        $jq.ajax({url: "http://www.somedomain.com/connector/browse/" + x + ".json" + "?callback=?",
            type: "get", // tried post too
            dataType: "json", // tried jsonp too
            accepts: "json",
            data: req_data, // this is JSON.stringified already
            processData:false,
            contentType: "application/json; charset=UTF-8;",
            success: output
        });

我要发送的示例数据是这样的

{"filters":[{"filter":{"attribute":"id","operator":">","value":"2"}},{"filter":{"attribute":"id","operator":"<","value":"7523"}}]} 

有没有人知道如何解决这个问题?

非常感谢!

4

1 回答 1

-1

基本上,JS SOP 会阻止我们发送 POST 请求并读取响应,但这可以像这样解决:

1) 编写请求数据,将其作为 POST 发送。不要期望收到回复。不要在成功时使用,而是在完成时使用。在请求中添加一个随机变量

2)将服务器端的响应临时存储在文件或会话变量或memcached服务器中,使用上面提到的随机变量作为存储内的键。

3) 发送第二个 JSON AJAX 调用以获取缓存对象。

使用 memcached,请确保不时删除缓存的响应或过期,在我的情况下,应用程序会获得大量流量,如果未设置为过期,它将向我的 memcache 服务器发送垃圾邮件。

这是一些示例代码

于 2013-09-18T23:20:45.290 回答