スクリプトのお勉強 技術

Rustのお勉強をしてみる(XMLRPCクライアント編)

投稿日:

なんとなく手付かずだったので、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/

-スクリプトのお勉強, 技術

執筆者:

関連記事

Githubからお告げ

Githubからお告げが来た お告げってのは大げさですが。 Github にpackage-lock.jsonを置いておくと、Githubが脆弱性検査をして、メールを知らせてくれます。 js-yaml …

Python3/ある日付から日付までの月/日/時間ごとの時刻を算出する

小ネタです。 要するに、時刻A と 時刻B を指定したときの、各時間間隔での時刻取得したかったです。 当初はdateutilを使う方法でなく、自前で実装しようと思ったのですが、面倒なことに気づきました …

コンピュータ系の人のためのCoinhive最高裁の読み方(なぜ無罪だったか)

以下ですべて断定してますが、そもそもからしてすべて想定です。私は法律家ではないので。 前回の記事で、Coinhiveの高裁判決について書きました。 今回は、無罪と決まったCoinhiveの最高裁判決を …

PythonでAESを使用して暗号/復号する

1.つづき Pythonで、PKCS#12の公開鍵で暗号、秘密鍵で復号するプログラムの続きです。 今回はAESで暗号化/復号を行い、通信しながらRSA暗号/復号,AES暗号/復号を組み合わせたいと思い …

Python3 – VCR.py でネットワーク系テストを簡単に作成する

1. 始めに python3で実装すると、モックテストをしたくなります。モックを使って、比較的簡単にテストできるからです。 問題はネットワーク系テスト モックテストで問題になるのは、外部に依存するテス …

google オプトアウト Click here to opt-out.