在Rails中,是否可以生成与HTTP请求行为相同的内部请求?

时间:2010-02-08 05:15:43

标签: ruby-on-rails ruby

在我的Rails应用程序中,我想生成与“真正的”HTTP请求行为相同的请求。

对于一个有点人为的例子,假设我正在创建一个可以批量传入HTTP请求以供以后处理的系统。它的接口类似于:

  1. 通过常用的CRUD方法创建新的批处理资源(POST,接收新创建的资源的位置)。
  2. 通过发送URL,HTTP方法和数据来更新批处理资源,以便将其添加到以后应该批量执行的请求集合中。
  3. “处理”批处理资源,其中它将遍历其请求集合(每个请求可能由URL,HTTP方法和一组数据表示),并以某种方式告诉Rails处理这些请求。就像他们正常进入“非批量”请求一样。
  4. 在我看来,要实现这一功能需要做两件重要的工作:

    首先,传入的请求需要以某种方式保存以供日后使用。这可以简单地是保存传入请求的各个方面的情况,例如路径,方法,数据,报头等已经作为控制器内的传入请求对象的一部分公开。如果有一种更“自动”的方式来处理这种情况会更好 - 可能更像是对象编组或序列化 - 但是记录单个参数的强力方法也应该有效。

    其次,保存的请求需要能够在以后重新注入rails应用程序,并经历与正常HTTP请求通过的相同的过程:路由,控制器,视图等。我d喜欢能够捕获字符串中的响应,就像HTTP客户端会看到它一样,我也想使用Rails的内部机制而不是简单地使用HTTP库来实现应用程序对自己的新要求。

    思想?

2 个答案:

答案 0 :(得分:0)

存储参数的直接方式应该序列化控制器中的请求对象 - 这应包含所有重要数据

稍后调用请求,我会考虑使用Dispatcher.dispatch类方法,它接受3个参数:cgi请求,会话选项(CgiRequest :: DEFAULT_SESSION_OPTIONS应该没问题)和输出写入的流到

答案 1 :(得分:0)

机架中间件

在我最初提出这个问题之后做了很多调查之后,我最终尝试并使用Rack Middleware成功实施了一个解决方案。

基本方法

在中间件的`call'方法中:

  1. 检查我们是否作为a的嵌套资源发出请求 事务对象,或者如果是普通请求。如果它是 普通的,通过调用来正常通过中间件 app.call(env),并返回状态,标题和响应。

  2. 除非这是一个事务提交,否则记录“有趣”的部分 请求的env哈希值,并将它们作为“操作”关联存储到数据库中 使用此事务对象。

  3. 如果这是事务提交,请检索所有相关操作 这笔交易。创建新的请求环境,或克隆 现有的一个并使用为操作保存的值填充它。也 制作原始请求环境的副本以供以后恢复,如果 控制意味着通常在提交后通过应用程序。

  4. 将构建的环境提供给app.call(env)。重复一遍 每次操作。

  5. 如果保留了原始请求环境,请将其还原并创建一个 最后调用app.call(env),从调用`call'返回 中间件来自此最终调用的状态,标头和响应 app.call(ENV)。

  6. 样本申请

    我已经实现了我在这里描述的方法的示例实现,我已经在GitHub上提供了它。它还包含一个深入的示例,描述了从API角度看实现的外观。请注意:它非常粗糙,完全没有文档(README除外),并且很可能违反了Rails良好的编码实践。它可以在这里获得:

    插件/宝石

    我也开始研究插件或gem,它将为任何Rails应用程序提供这种接口。它处于形成阶段(实际上它目前完全没有代码),并且它的工作可能会缓慢进行。探索它在这里发展:

    另见