【问题标题】:Apache module FORM handling in CC中的Apache模块FORM处理
【发布时间】:2010-09-11 09:13:24
【问题描述】:

我正在用 C 语言实现一个 Apache 2.0.x 模块,以与我们现有的产品进​​行交互。我需要处理 FORM 数据,很可能使用 POST,但我也想处理 GET 情况。

Nick Kew 的Apache Modules 书中有一节是关于处理表单数据的。它提供了 POST 和 GET 的代码示例,它们返回表单中键 + 值对的 apr_hash_t。 parse_form_from_POST 编组桶旅并将其展平为缓冲区,而 parse_form_from_GET 可以简单地引用 URL。这两个例程都依赖于 parse_form_from_string 例程来遍历每个分隔字段并将信息提取到哈希表中。

这很好,但似乎应该有比在我的模块中添加几百行代码更简单的方法。 apache、apr 或 apr-util 中是否有现有的模块或例程来将字段名称和相关数据从 GET 或 POST FORM 提取到 C 代码更容易访问的结构中?我找不到任何相关的东西,但这似乎是一个应该有解决方案的普遍需求。

【问题讨论】:

    标签: c forms apache apache2


    【解决方案1】:

    虽然从表面上看,这似乎很常见,但 apache 上的 C 语言中的 cgi 样式内容处理程序却很少见。大多数人只使用 CGI、FastCGI 或无数框架,例如 mod_perl。

    我编写的大多数 C apache 模块都旨在以适用于每个请求的特定、有针对性的方式修改 Web 服务器的特定行为。

    如果有可能在 apache 模块之外编写您的处理程序,我会鼓励您采用这种策略。

    【讨论】:

    • 这与答案完全相反!为什么我们不应该寻找简单的方法来编写用 C 进行表单处理的 Apache 模块?
    • 在 Apache 上用 C 语言编写表单处理代码就像将用户空间应用程序编写为内核模块一样。这很难,因为没有人这样做,而且它并不是真的为此目的。
    • 我知道这个问题已经很老了,但是现在在 2012 年可以使用 Apache API 函数进行表单解析,所以我认为 Apache 模块不应该进行表单解析的想法已经过时了。将内容处理程序编写为 Apache 模块的想法可能并不常见,但在某些情况下它可能最有意义。无论如何,如果书中的样本足以完成任务,那么答案不是“不要这样做”而是“是的,这是最简单的方法”。
    • 很公平。因此,虽然有一个关于如何做到这一点的答案,但我仍然建议不要这样做,因为有人对该项目有一些已接受的补丁。如果您想在 C 语言中保持低调和肮脏,可能是为了速度,在这种情况下,像 nginx 这样的轻量级 Web 服务器是更好的方法。
    • 我知道在我的情况下,进入 C 的愿望可能更像是“精神疾病”而不是其他任何东西。 ;) 感谢您提到 nginx。有趣的选择。
    【解决方案2】:

    我改用 G-WAN,它为 GET 和 POST 表单(以及许多其他好东西,如图表、GIF I/O 等)提供了一个透明的 ANSI C 脚本接口。

    GWAN developer page 上提供了几个 AJAX 示例

    希望对你有帮助!

    【讨论】:

    • 我不认为这个回复解决了 OP 关于用 C 编写 Apache 模块的问题,其中 Apache 的版本早于 ap_parse_form_data() 函数的引入。 (见 ap_mmn.h 20110203.2 2.3.11-dev)
    【解决方案3】:

    我还没有尝试过任何解决方案,因为我自己也对“Apache Modules”书中的示例感到沮丧,因此我发现了这个 SO 问题。但到目前为止,这是我发现的。当我进行更多研究时,我会更新这个答案。

    幸运的是,现在这似乎是 Apache 2.4 中使用ap_parse_form_data 函数解决的问题。

    不知道这与您的示例相比效果如何,但这里有一个much more concise read_post function

    mod_form 也可能有价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 2017-10-07
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多