5

我想在我的应用程序中调用该方法并从 Ruby on Rails 技术中的另一个应用程序获取响应,但是这里存在跨站点脚本问题。所以,我可以解决这个问题,请帮助我,这会很棒。

http://video_tok.com/courses/get_course

def get_course
  @course = Course.find(params[:id])
end

现在我想从在 edupdu.com 域中运行的这个应用程序中调用上述方法

http://edupdu.com/call_course_method

def call_course_method
  @course = redirect_to "http://video_tak.com/courses/get_course/1"
end

但它会被重定向到 video_tak.com 应用程序。我想调用 get_course 方法并在内部获取 @course 对象而不重定向到另一个站点。

提前致谢。

4

1 回答 1

3

跨域AJAX确实是个问题,但没有一个是解决不了的。在您的get_course方法中,您可以将课程对象作为 JSON 响应返回,如下所示:

render json: @course

从那里您可以通过 JavaScript (AJAX) 检索课程,在这里您应该使用 JSONP 或通过发出 HTTP GET 请求在 Rails 内部。

  1. 带有 JSONP 的 AJAX

    有 JSONP(带填充的 JSON),它是 JavaScript 程序的一种通信技术,用于提供一种方法来从不同域中的服务器请求数据。查看jQuery.getJSON()的文档并向下滚动到 JSONP 部分。

    如果 URL 包含字符串"callback=?"(或类似的,由服务器端 API 定义),则请求将被视为 JSONP。有关更多详细信息,请参阅jsonp数据类型的讨论。$.ajax()

  2. HTTP GET 请求

    只需使用Net::HTTP类:

    require 'net/http'
    require 'json'
    
    url = URI.parse('http://video_tak.com/courses/get_course/1')
    req = Net::HTTP::Get.new(url.to_s)
    res = Net::HTTP.start(url.host, url.port) do |http|
      http.request(req)
    end
    course_json = JSON.parse(res.body)
    

    如果您为模型提供将 JSON 转换为您的域对象的方法,则可以从那里获取它。


RPC

您还可以使用 RPC 在不同的 Ruby 进程之间调用方法,尽管我至少建议这样做,但我不想省略它。有几个远程过程调用 (RPC) 库。Ruby 标准库提供DRb,但也有基于 Ruby on Rails 的实现,例如rails-xmlrpc gem,它允许您基于XML-RPC协议或使用 JSON 和 json-rpcj的替代协议实现 RPC

在搜索Rails RPC时,您可能会发现更多的库。从您选择的任何库中,具体的解决方案都会有所不同。

于 2013-08-13T08:32:14.900 回答