【问题标题】:How to wrap a C library so that it can be called from a web service如何包装 C 库以便可以从 Web 服务调用它
【发布时间】:2010-02-10 20:52:14
【问题描述】:

我们有一个用 C 实现的逻辑非常复杂的库。它有一个命令行界面,基于字符串的参数不太复杂。为了访问它,我们希望包装该库,以便可以通过简单的 XML RPC 甚至直接的 HTTP POST 调用来访问它。

有一些Java经验,我的第一个想法是

  • 将库包装在JNI/JNA
  • 使用瘦 WS 堆栈和 servlet 引擎
  • 通过 Apache 到 servlet 引擎的代理请求

我相信应该已经有一些简单的东西可以使用,所以我在这里发布这个问题。一个解决方案有以下要求

  • 它应该可以部署到当前的 linux 发行版,最好已经通过包管理提供
  • 它应该与标准 Web 服务器集成(如我的示例 Apache)
  • 图书馆界面的小改动应该是易于管理的
  • 端到端 (HTTP-WS-library-WS-HTTP) 解决方案不应产生过多开销,但可靠性非常重要

作为 JNI/JNA 提案的替代方案,我认为在 C# 世界中编写 Web 服务并调用此 非托管代码 模块应该不会太难,但我希望有人能给我一些在需求方面可行的指针。

【问题讨论】:

    标签: c web-services http unmanaged wrapper


    【解决方案1】:

    如果您要使用网络服务,也许Soaplab 会很有用。它基本上是一种将现有命令行应用程序包装在 SOAP Web 服务中的工具。它生成的 Web 服务看起来有点奇怪,但它是一种非常流行的方式来完成这样的工作。

    【讨论】:

      【解决方案2】:

      创建一个 apache 模块非常简单,因为您熟悉 xmlrpc,您应该查看 mod-xmlrpc2。您可以轻松地将您的 C 代码添加到这个 apache 模块,并在几分钟内拥有一个正在运行的 xmlrpc 服务器

      【讨论】:

      • 我对所有好的答案都投了赞成票,但这是我们实际采取的路线。谢谢你,鲍勃。
      【解决方案3】:

      我认为您也可以将其发布为基于 SOAP 的 Web 服务。 gSoap 可用于提供库外的服务接口。你探索过 gSOAP 吗?见http://www.cs.fsu.edu/~engelen/soap.html

      问候, 康坎

      【讨论】:

        【解决方案4】:

        取决于您熟悉的技术、您已经在服务器上安装和运行的技术以及您的负载要求。

        原始 CGI 怎么样?假设 C 代码在请求之间是无状态的,您可以在完全不修改库的情况下执行此操作。编写一个简单的脚本,将请求参数从 CGI 环境中提取出来,可能会清理输入,通过命令行界面调用库,然后将结果打包到您想要的任何 HTTP 响应中。然后配置 Apache 以将相关 URL 分派到此脚本。例如,Python 具有对 XML-RPC 的库支持,网络上使用的所有其他脚本语言也是如此。

        Servlet 听起来有点矫枉过正,但例如,如果您希望每个 CGI 进程实例化多个请求,并且不想参与 Apache 配置,那么坚持您所知道的可能是最容易的。

        【讨论】:

        • 谢谢,这是一个非常直接和简单的建议,我(奇怪的是)没有真正考虑过。这样做不应该太复杂。该库的 CLI 尚未完成,但我相信直接 API 调用 (1) 更稳定且 (2) 更快。但是,我认为这将是我们将尝试的第一个实现。谢谢。
        【解决方案5】:

        我现在正在用 C++ 做类似的事情。就我而言,我正在编写一个 PHP 模块以允许 PHP 脚本访问我的 C++ 库中的逻辑。

        然后我可以使用任何我想让世界其他地方看到的格式 - 最初它只是通过 PHP Web 应用程序,但我还将开发一个 XML-RPC 接口。

        【讨论】:

          【解决方案6】:

          如果您要走 JNI 路线,请查看 SWIG。 http://www.swig.org/Doc1.3/Java.html

          假设您有用于项目绑定的标头,swig 很容易使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-07
            • 1970-01-01
            • 2015-08-03
            • 2012-03-13
            • 2021-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多