【问题标题】:Understanding JSON-RPC in Perl理解 Perl 中的 JSON-RPC
【发布时间】:2014-02-07 21:27:24
【问题描述】:

我试图理解 JSON RPC 的概念和它的 Perl 实现。虽然我可以找到很多 Python/Java 的示例,但在 Perl 中却发现很少或没有示例。

我正在关注this example,但不确定它是否完整。我想到的例子是添加 2 个整数。现在我设置了一个非常基本的 HTML 页面,如下所示:

<html>
<body>
    <input type="text" name="num1"><br>
    <input type="text" name="num2"><br>
    <button>Add</button>
</body>
</html>

接下来,根据上面的例子,我有3个文件:

test1.pl

# Daemon version
use JSON::RPC::Server::Daemon;

# see documentation at:
# https://metacpan.org/pod/distribution/JSON-RPC/lib/JSON/RPC/Legacy.pm

my $server = JSON::RPC::Server::Daemon->new(LocalPort => 8080);
$server -> dispatch({'/test' => 'myApp'});
$server -> handle();

test2.pl

#!/usr/bin/perl

use JSON::RPC::Client;

my $client = new JSON::RPC::Client;

my $uri = 'http://localhost:8080/test';
my $obj = {
method => 'sum', # or 'MyApp.sum'
params => [10, 20],
};

my $res = $client->call( $uri, $obj );

if($res){
if ($res->is_error) {
print "Error : ", $res->error_message;
} else {
print $res->result;
}
} else {
print $client->status_line;
}

myApp.pl

package myApp;

#optionally, you can also
use base qw(JSON::RPC::Procedure);  # for :Public and :Private attributes

sub sum : Public(a:num, b:num) {
my ($s, $obj) = @_;
return $obj->{a} + $obj->{b};
}

1;

虽然我了解这些文件各自的作用,但在组合它们并使它们一起工作时,我完全不知所措。

我的问题如下:

  • HTML 页面中的按钮是否位于标签内(就像我们通常在基于 CGI 的程序中所做的那样)?如果是,那会调用什么文件?如果不是,那么如何传递要添加的值?
  • 3 个 Perl 文件的执行顺序是什么?哪个叫哪个?执行流程如何?
  • 当我尝试从 CLI(即使用 $./test2.pl)运行 perl 文件时,我收到以下错误:错误 301 永久移动。什么东西永久移动了?它试图访问哪个文件?我尝试从 /var/www/html/var/www/html/test 运行文件。

我们非常感谢您对理解其中细微差别的帮助。提前致谢

【问题讨论】:

    标签: html json perl rpc json-rpc


    【解决方案1】:

    HTML 页面中的按钮是否位于标签内(就像我们会的那样 *通常在基于 CGI 的程序中执行)?如果是,那会调用什么文件?* 如果不是,那我如何传递要添加的值?

    HTML 与 JSON-RPC 完全没有关系。虽然 RPC 调用是通过 HTTP POST 请求完成的,但如果您从浏览器执行此操作,则需要使用 XMLHttpRequest(即:AJAX)。取消链接 HTML 表单后 Content-encoding: 标头将需要特定于 JSON-RPC(例如:application/json 或类似),并且您需要通过 JSON.stringify 对表单数据进行编码并正确构造 JSON- RPC“信封”,包括idjsonrpcmethodparams属性。

    您可以使用专门构建的 JSON-RPC JavaScript 客户端,例如 jQuery-JSONRP 插件(还有很多其他插件),而不是手动执行此操作——尽管该协议非常简单,实现通常少于 20 行代码。

    从 jQuery-RPC 文档中,您可以这样设置连接:

    $.jsonRPC.setup({
      endPoint: '/ENDPOINT-ROUTE-GOES-HERE'
    });
    

    你会像这样调用服务器端方法:

    $.jsonRPC.request('sum', {
      params: [YOURNUMBERINPUTELEMENT1.value, YOURNUMBERINPUT2.value],
      success: function(result) {
        /* Do something with the result here */
      },
      error: function(result) {
        /* Result is an RPC 2.0 compatible response object */
      }
    });
    

    3 个 Perl 文件的执行顺序是什么?哪个叫 *哪一个?执行流程如何?*

    您可能只需要test2.pl 进行测试。这是 JSON-RPC 客户端的示例实现。您可能希望您的客户端在您的网络浏览器中运行(如上所述)。客户端 JavaScript 将向 test1.pl 提供内容的任何位置发出 HTTP POST 请求。 (例如:http://localhost:8080)。

    或者,如果你想将你的代码保留为 HTMLCGI,那么你需要在你的 Perl CGI 服务器端代码中进行 JSON-RPC 客户端调用(如果它在同一机器)。

    test1.pl 调用dispatch 时,MyApp 模块将被加载。 那么当test1.pl调用handle时,MyApp包中的sum函数就会被调用。

    JSON::RPC::Server 模块负责从 JSON-RPC 编组到 perl 数据结构,然后在调用 handle 时再次返回。 die()ing in sum 应该导致 JSON-RPC 异常被传输到调用客户端,而不是 test1.pl 脚本的死亡。

    当我尝试从 CLI 运行 perl 文件时,即使用 *$./test2.pl,我收到以下错误:错误 301 永久移动。* 什么东西永久移动了?它试图访问哪个文件?我试过了 *从 withing /var/www/html 和 /var/www/html/test 运行文件。*

    这在很大程度上取决于您机器的配置。没有什么明显的(在您的代码中)表明将发出 301 Moved Permanently 以响应有效的 JSON-RPC 请求。

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2014-09-24
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多