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が試せるだけで大分進んだ気がする。