なんとなく手付かずだったので、Rustの勉強をしてみようと思います。
手始めとして、なぜかXMLRPCクライアントを作ってみます。
環境
- WSL2
- Ubuntu 22.04 LTS
Rustインストール
インストール方法は以下です。
以下で自分のホームディレクトリにインストールします。
$ curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh $ source ~/.bashrc $ rustc -V rustc 1.66.0 (69f9c33d7 2022-12-12)
XMLRPCサーバ側(Python)
RustでXMLRPCクライアントを作ろうと思いますが、接続先のXMLRPCサーバは面倒なのでPythonで作成します。
add関数を提供してみます。戻り値はあえて辞書にしてます。
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
with SimpleXMLRPCServer(('localhost', 9000),
requestHandler=RequestHandler) as server:
server.register_introspection_functions()
# Register a function under a different name
def adder_function(x, y):
return dict(result=x + y)
server.register_function(adder_function, 'add')
server.serve_forever()
Rust開始
以下まで準備しました。
$ cargo new rust-xmlrpc $ cd rust-xmlrpc $ cargo run Compiling rust-xmlrpc v0.1.0 (/home/tanino/script-plactice/rust-xmlrpc/rust-xmlrpc) Finished dev [unoptimized + debuginfo] target(s) in 0.44s Running `target/debug/rust-xmlrpc` Hello, world!
あとlibssl-devをインストールする必要があります。でないとcargo run時に落ちます。
$ sudo apt instlal libssl-dev
XMLRPCクライアントのサンプル
いよいよXMLRPCクライアントです。
Calgo.toml
要は、dependenciesにxmlrpcを入れます。
[package] name = "rust-xmlrpc-client" version = "0.1.0" edition = "2021" [dependencies] xmlrpc = "0.15.1"
src/main.rs
クライアント部分は以下です。
extern crate xmlrpc;
use xmlrpc::Request;
fn main() {
let add_request = Request::new("add").arg(2).arg(8); // Compute 2 + 8
let request_result = add_request.call_url("http://127.0.0.1:9000/RPC2");
println!("Result: {:?}", request_result);
let _add_result = request_result.unwrap();
println!("_add_result: {:?}", _add_result["result"]);
}
起動結果
起動すると以下になります。ちゃんと辞書として結果が返ってきているのがわかります。
$ cargo run Compiling rust-xmlrpc-client v0.1.0 (/home/tanino/script-plactice/rust-xmlrpc/rust-xmlrpc) Finished dev [unoptimized + debuginfo] target(s) in 2.41s Running `target/debug/rust-xmlrpc-client` Result: Ok(Struct({"result": Int(10)})) _add_result: Int(10)
おわりに
思った以上に簡単でした。次は、REST APIのserverとclientを作ろうと思います。
参考
- RustのXMLRPC(標準?)
https://docs.rs/xmlrpc/latest/xmlrpc/