理解Perl中的JSON-RPC

4
我正在努力理解JSON RPC的概念,以及它在Perl中的实现。尽管我可以找到很多Python/Java的示例,但是对于Perl,惊讶地发现几乎没有任何示例。
我正在按照这个示例进行学习,但不确定它是否完整。我想要的示例是将两个整数相加。现在,我已经设置了一个非常基本的HTML页面,如下所示:
<html>
<body>
    <input type="text" name="num1"><br>
    <input type="text" name="num2"><br>
    <button>Add</button>
</body>
</html>

接下来,基于上面的例子,我有三个文件: 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页面中的按钮是否位于 <form> 标签内(就像我们通常在基于CGI的程序中所做的那样)?如果是,那么它会调用哪个文件?如果不是,那么我该如何传递要添加的值?
  • 这3个Perl文件的执行顺序是什么?哪一个调用了哪一个?执行流程是怎样的?
  • 当我尝试从CLI运行perl文件,即使用 $./test2.pl,我得到了以下错误:Error 301 Moved Permanently。移动了什么?它试图访问哪个文件?我尝试从 /var/www/html/var/www/html/test 内运行文件。

希望能帮助您理解其中的细微差别。提前感谢!

1个回答

3
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 */
  }
});

三个Perl文件的执行顺序是什么?谁调用了哪一个?执行流程是怎样的?
你可能只需要使用test2.pl进行测试,它是一个JSON-RPC客户端的示例实现。你可能希望你的客户端在Web浏览器中运行(如上所述)。客户端JavaScript将向任何地方发送HTTP POST请求,例如test1.pl正在提供内容的位置(例如:http://localhost:8080)。
或者,如果你想将代码保持为HTML<--->CGI,则需要从Perl CGI服务器端代码内部进行JSON-RPC客户端调用(如果它在同一台机器上似乎很荒谬)。
当test1.pl调用dispatch时,MyApp模块将被加载。然后,当test1.pl调用handle时,将调用MyApp包中的sum函数。
JSON::RPC::Server模块负责在调用handle时将JSON-RPC转换为perl数据结构并再次转换回来。在sum中die()应该导致将JSON-RPC异常传输到调用客户端,而不是终止test1.pl脚本的执行。
当我尝试从CLI运行Perl文件时,即使用$./test2.pl,我得到以下错误:错误301永久移动。是什么永久移动了?它试图访问哪个文件?我尝试从/var/www/html和/var/www/html/test中运行文件。这在很大程度上取决于你的机器配置。在你的代码中,没有明显的迹象表明对有效的JSON-RPC请求会发出301永久移动的响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接