reqwestでipを指定して送る場合は、client.post(“***.**.***.**:3000/post”) だと送れないが、client.post(“http://***.**.***.**:3000/post”) だと問題なく送ることができる。
送る側(ローカル開発環境)
async fn test()-> Result<(), Box<dyn std::error::Error>> {
let n = Name { family: "tanaka".to_string(), first:"taro".to_string(), age: 20 };
let json = json!(n);
println!("{:?}", &json);
let client = reqwest::Client::new();
let resp = client.post("http://***.**.***.**:3000/post")
.json(&json)
.send()
.await?;
let body = resp.text().await?;
println!("{}", body);
Ok(())
}
受け取る側(VPS: ***.**.***.**)
async fn main() {
let app = Router::new()
.route("/", get(handle_index))
.route("/post", post(handle_post))
.route("/test", get(handle_test));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn handle_post(extract::Json(name): extract::Json<Name>) ->impl IntoResponse{
println!("{:?}", name);
return "All OK".into_response();
}
受け取る側
$ cargo run
Compiling axum v0.1.0 (/home/ubuntu/test/rust_test)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 12.90s
Running `target/debug/axum`
Name { family: “sato”, first: “taro”, age: 50 }
Name { family: “tanaka”, first: “taro”, age: 20 }
送る側
Compiling axum v0.1.0 (/home/vagrant/dev/rust/axum)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 12.59s
Running `target/debug/axum`
Object {“age”: Number(20), “family”: String(“tanaka”), “first”: String(“taro”)}
All OK
reqwestが使えるというのがわかったのは収穫だが、IPだけでなく、httpsかhttpかというプロトコルも一緒に取得する必要がある。
discussion
https://github.com/tokio-rs/axum/discussions/858
ちなみに、VPSでweb socketで待ち受けて、ws://***.**.***.**:3000/ws で接続しても問題なく接続できた。
async fn handler(ConnectInfo(addr): ConnectInfo<SocketAddr>, ws: WebSocketUpgrade) -> Response {
println!("{}", addr);
ws.on_upgrade(handle_socket)
}
async fn handle_socket(mut socket: WebSocket) {
while let Some(msg) = socket.recv().await {
let mut msg = if let Ok(mut msg) = msg {
msg
} else {
return;
};
if socket.send(msg).await.is_err() {
// client disconnected
return;
}
}
}
なるほど、reqwestが試せるだけで大分進んだ気がする。