【问题标题】:CGI script communicationCGI 脚本通信
【发布时间】:2015-01-06 16:31:53
【问题描述】:

我有两个用 Perl 编写的 CGI 脚本,我想在两者之间实现以下通信序列。脚本 A 向脚本 B 发送 POST 请求,然后它应该等待 B 通过查询数据库来执行某种类型的验证,然后 B 将成功或失败连同自定义代码一起发送回 A。 1122 特定于我的应用程序,并且 A 会酌情继续执行。这是使用 LWP 框架可以实现的吗?

我尝试从 A 向 B 发送 POST 请求,然后使用

在脚本 A 中等待
 while(<STDIN>) {
     $response .= $_;
 }

直到它收到 B 的回复(另一个 POST),但这不起作用,因为 A 只是忽略了 SDTIN 循环并继续。

不用说我对 CGI 完全陌生,我发现的大多数答案都涉及对 CGI 脚本的简单 POST 或 GET 请求,但不是双向通信,即一端必须等待另一端在验证后响应已经发生了。

【问题讨论】:

    标签: perl cgi lwp lwp-useragent


    【解决方案1】:

    您无需执行任何操作即可让脚本等待响应。 LWP 默认是同步的。

    只需提出请求,然后照常阅读$res-&gt;content;(不是STDIN!)(有关扩展示例,请参阅the documentation)。

    如果您使用 CGI,则根本不应该直接接触 STDIN。理想情况下,您将使用Plack/PSGI,因此您将通过 Plack API(或构建在其之上的框架)访问所有输入。如果您使用的是遗留代码,那么您可能会使用 CGI.pm,它提供了自己的 API 用于读取输入(通过 param)。


    不用说我对 CGI 完全陌生,我发现的大多数答案都涉及对 CGI 脚本的简单 POST 或 GET 请求,但不是双向通信,即一端必须等待另一端在验证后响应已经发生了。

    正在发出简单的 POST 或 GET 请求。

    1. 浏览器向A.cgi发出请求
    2. A.cgiB.cgi 提出请求
    3. B.cgi 输出响应
    4. A.cgi 读取该响应并对其进行处理
    5. A.cgi 输出响应
    6. 浏览器收到响应

    【讨论】:

    • 但是,在 B 执行 db 查找并发现例如 A 的 POST 请求有效之后,来自 B 的响应应该如何?如果我在 B 收到 POST 并开始查找数据库以进行验证时执行您描述的步骤 A 已经收到 200 OK(成功)...
    • B 的响应可以随心所欲。现在大多数网络服务都会输出一个 JSON 文档。
    • LWP 默认不是异步的,执行我描述的步骤不会导致 A 返回响应,直到它读取来自 B 的响应。它只会在您执行某些操作以显式发送在 A 完成运行之前响应。
    猜你喜欢
    • 2013-05-13
    • 2012-02-16
    • 2011-02-04
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2011-02-14
    相关资源
    最近更新 更多